楼主: 老虎借猪

一个简单程序的疑惑

[复制链接]
论坛徽章:
53
2010新春纪念徽章
日期:2010-03-01 11:19:062012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主1段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
11#
发表于 2007-5-21 10:23 | 只看该作者
贴一下错误和输出吧

使用道具 举报

回复
论坛徽章:
15
ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:37金牛座
日期:2016-01-06 14:04:03沸羊羊
日期:2015-07-06 16:16:54慢羊羊
日期:2015-06-15 14:42:49马上有房
日期:2014-08-10 15:53:492014年世界杯参赛球队: 哥伦比亚
日期:2014-06-19 22:12:412014年新春福章
日期:2014-02-22 21:58:42马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11大众
日期:2014-01-29 20:58:06
12#
发表于 2007-5-21 11:25 | 只看该作者
精度问题,建议四舍五入呵

使用道具 举报

回复
论坛徽章:
15
ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:37金牛座
日期:2016-01-06 14:04:03沸羊羊
日期:2015-07-06 16:16:54慢羊羊
日期:2015-06-15 14:42:49马上有房
日期:2014-08-10 15:53:492014年世界杯参赛球队: 哥伦比亚
日期:2014-06-19 22:12:412014年新春福章
日期:2014-02-22 21:58:42马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11大众
日期:2014-01-29 20:58:06
13#
发表于 2007-5-21 11:37 | 只看该作者
这网站速度那叫一个慢
推荐解决方法,也是一般都会用的

public static void main (String args[]) {
        double nums[] = {10.1,50.2,10.3,10.4,10.0};
        BigDecimal result = new BigDecimal(0.0),average;
        for(int i = 1;i < 6;i++) {
                result = result.add(new BigDecimal(String.valueOf(nums[i - 1])));
                average = result.divide(result,i);
                System.out.println("i is: " + i);
                System.out.println("result is: "+result.doubleValue());
                System.out.println("average is " + average.doubleValue());
                System.out.println("===========================";
        }
}

使用道具 举报

回复
论坛徽章:
28
ITPUB元老
日期:2006-04-17 15:28:45鲜花蛋
日期:2013-06-29 18:18:17奥迪
日期:2014-01-20 14:26:47宝马
日期:2014-02-11 17:28:13马上有车
日期:2014-12-17 15:34:59马上有钱
日期:2015-01-29 14:14:42喜羊羊
日期:2015-05-11 14:29:37双鱼座
日期:2015-08-21 16:14:39金牛座
日期:2015-08-29 00:26:44灰彻蛋
日期:2013-05-28 09:32:40
14#
 楼主| 发表于 2007-5-21 11:57 | 只看该作者
再请教楼上,BigDecimal中有直接把浮点型转换的构造方法,但是把你上述的代码

result = result.add(new BigDecimal(String.valueOf(nums[i - 1])));改成

result = result.add(new BigDecimal(nums[i - 1]));还是达不到精度的要求

为什么?

使用道具 举报

回复
论坛徽章:
28
ITPUB元老
日期:2006-04-17 15:28:45鲜花蛋
日期:2013-06-29 18:18:17奥迪
日期:2014-01-20 14:26:47宝马
日期:2014-02-11 17:28:13马上有车
日期:2014-12-17 15:34:59马上有钱
日期:2015-01-29 14:14:42喜羊羊
日期:2015-05-11 14:29:37双鱼座
日期:2015-08-21 16:14:39金牛座
日期:2015-08-29 00:26:44灰彻蛋
日期:2013-05-28 09:32:40
15#
 楼主| 发表于 2007-5-21 12:01 | 只看该作者
还有你的代码,平均值有错误,输出如下:

i is: 1
result is: 10.1
average is 1.0
===========================
i is: 2
result is: 60.3
average is 1.0
===========================
i is: 3
result is: 70.6
average is 1.0
===========================
i is: 4
result is: 81.0
average is 1.0
===========================
i is: 5
result is: 91.0
average is 1.0
===========================

使用道具 举报

回复
论坛徽章:
15
ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:37金牛座
日期:2016-01-06 14:04:03沸羊羊
日期:2015-07-06 16:16:54慢羊羊
日期:2015-06-15 14:42:49马上有房
日期:2014-08-10 15:53:492014年世界杯参赛球队: 哥伦比亚
日期:2014-06-19 22:12:412014年新春福章
日期:2014-02-22 21:58:42马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11大众
日期:2014-01-29 20:58:06
16#
发表于 2007-5-21 13:26 | 只看该作者
sorry没仔细看

public static void main (String args[]) {
        double nums[] = {10.1,50.2,10.3,10.4,10.0};
        BigDecimal result = new BigDecimal(0.0),average;
        for(int i = 1;i < 6;i++) {
                result = result.add(new BigDecimal(String.valueOf(nums[i - 1])));
                average = result.divide(new BigDecimal(i),3,BigDecimal.ROUND_CEILING);
                System.out.println("i is: " + i);
                System.out.println("result is: "+result.doubleValue());
                System.out.println("average is " + average.doubleValue());
                System.out.println("===========================";
        }
}

转换成String是因为计算机操作存储浮点数的时候会有问题(并不只是java语言有这个问题),换成string就没有精度的问题了

使用道具 举报

回复
论坛徽章:
4
生肖徽章:牛
日期:2007-05-07 05:31:44ERP板块每日发贴之星
日期:2007-05-21 01:02:55设计板块每日发贴之星
日期:2007-05-23 01:04:28会员2007贡献徽章
日期:2007-09-26 18:42:10
17#
发表于 2007-5-21 19:24 | 只看该作者
result=Math.round((result+nums[i-1])*100)/100.00;
double average=Math.round(result*100/i)/100.00;

这样做不知道对不对
cycle 1
result is: 10.1
average is 10.1
cycle 2
result is: 60.3
average is 30.15
cycle 3
result is: 70.6
average is 23.53
cycle 4
result is: 81.0
average is 20.25
cycle 5
result is: 91.0
average is 18.2

使用道具 举报

回复
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
18#
发表于 2007-5-22 00:13 | 只看该作者

Re: 一个简单程序的疑惑

最初由 老虎借猪 发布
[B]源程序如下:
class Average2
{
public static void main (String args[])
{
       
   double nums[] ={10.1,50.2,10.3,10.4,10.0};
   double result=0.0;


   for (int i=1;i<6;i++){


   result=result+nums[i-1];
   double average=result/i;
   System.out.println("result is: "+result);
   System.out.println("average is " + average);
   }

}
}

为什么不能得出正确的结果? [/B]


可以执行啊!
JDK 1.6
执行结果:
result is: 10.1
average is 10.1
result is: 60.300000000000004
average is 30.150000000000002
result is: 70.60000000000001
average is 23.533333333333335
result is: 81.00000000000001
average is 20.250000000000004
result is: 91.00000000000001
average is 18.200000000000003

使用道具 举报

回复
论坛徽章:
28
ITPUB元老
日期:2006-04-17 15:28:45鲜花蛋
日期:2013-06-29 18:18:17奥迪
日期:2014-01-20 14:26:47宝马
日期:2014-02-11 17:28:13马上有车
日期:2014-12-17 15:34:59马上有钱
日期:2015-01-29 14:14:42喜羊羊
日期:2015-05-11 14:29:37双鱼座
日期:2015-08-21 16:14:39金牛座
日期:2015-08-29 00:26:44灰彻蛋
日期:2013-05-28 09:32:40
19#
 楼主| 发表于 2007-5-22 11:26 | 只看该作者
最初由 deathmaster 发布
[B]sorry没仔细看

转换成String是因为计算机操作存储浮点数的时候会有问题(并不只是java语言有这个问题),换成string就没有精度的问题了 [/B]


基本搞清楚了,看来小数运算还是用BigDecimal比较好

使用道具 举报

回复
论坛徽章:
28
ITPUB元老
日期:2006-04-17 15:28:45鲜花蛋
日期:2013-06-29 18:18:17奥迪
日期:2014-01-20 14:26:47宝马
日期:2014-02-11 17:28:13马上有车
日期:2014-12-17 15:34:59马上有钱
日期:2015-01-29 14:14:42喜羊羊
日期:2015-05-11 14:29:37双鱼座
日期:2015-08-21 16:14:39金牛座
日期:2015-08-29 00:26:44灰彻蛋
日期:2013-05-28 09:32:40
20#
 楼主| 发表于 2007-5-22 11:27 | 只看该作者

Re: Re: 一个简单程序的疑惑

最初由 gavinfu 发布
[B]

可以执行啊!
JDK 1.6
执行结果:
result is: 10.1
average is 10.1
result is: 60.300000000000004
average is 30.150000000000002
result is: 70.60000000000001
average is 23.533333333333335
result is: 81.00000000000001
average is 20.250000000000004
result is: 91.00000000000001
average is 18.200000000000003 [/B]


是可以执行,你觉得精度没有问题吗

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表