`
8366
  • 浏览: 800090 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

n 个double相加的问题

阅读更多

 

先看下面的例子:

 

public class Test
{

	public static void main(String[] args)
	{
		

		double sum=0;
		double temp=0.38;
		for(int i=0;i<10;i++)
		{
			sum=sum+temp;
			System.out.println("sum:"+sum);
			System.out.println(sum);
		}
		
	}

}

 

程序运行后打印出下面的结果:

 

sum:0.38
0.38
sum:0.76
0.76
sum:1.1400000000000001
1.1400000000000001
sum:1.52
1.52
sum:1.9
1.9
sum:2.28
2.28
sum:2.6599999999999997
2.6599999999999997
sum:3.0399999999999996
3.0399999999999996
sum:3.4199999999999995
3.4199999999999995
sum:3.7999999999999994
3.7999999999999994

 

这并不是我们需要的结果,为啥会这样呢?

 

 

 

 

 

 

 

 

 

 

 

 

Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。  
  这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。  
  在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。现在让我们看看如何解决这个问题。

 

 

public class Test
{

	public static void main(String[] args)
	{
		

		double sum=0;
		double temp=0.38;
		for(int i=0;i<10;i++)
		{
		    BigDecimal b1=new BigDecimal(Double.toString(sum));
                                    BigDecimal b2=new BigDecimal(Double.toString(temp));
                                    sum=b1.add(b2).doubleValue();								}
		    System.out.println("sum"+sum);	
	}

}

 

 sum:0.38
sum:0.76
sum:1.14
sum:1.52
sum:1.9
sum:2.28
sum:2.66
sum:3.04
sum:3.42
sum:3.8

 

 

 

分享到:
评论
2 楼 haiyangyiba 2012-08-21  
不知为何?
最关键的代码在这里:BigDecimal b1=new BigDecimal(Double.toString(sum));
这句中的 Double.toString(sum);这里
1 楼 liangwenzheng 2008-11-18  
learning~

相关推荐

    程序中两个Double类型相加出现误差的解决办法

    今天在自己做的系统中,发现了一个奇怪的现象:几个Double类型的数据相加,到最后得出的金额比正确数值总是少了几毛钱。以为是程序里的计算方法有问题,可是排查了很多地方,始终没有找到问题出在哪里。最后干脆把...

    世界500强面试题.pdf

    1.3.7. n 个数字(0,1,…,n-1)形成一个圆圈 .................................................. 53 1.3.8. 定义 Fibonacci 数列 ...............................................................................

    java 经典习题.doc

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... ...

    C++ 小型复数计算器

    cout加法计算\n"最少输入两个复数,并且以0结束\n"; cout第一个复数:"; cin&gt;&gt;num1; cout第二个复数:"; cin&gt;&gt;num2; sum=num1+num2; cout第三个复数:"; cin&gt;&gt;num1; int i=4; while(!(num1==Zero)) { sum=sum+num1; cout...

    基于MATLAB与C交互的幻方阵输出.rar

    你需要创建一个对话框,从对话框获得待定方阵的阶n,然后向matlab传递这个n,并从matlab处获得这个n*n的矩阵数据,最后以矩阵形式显示在窗口中。 输入矩阵没有限定大小,不能采用静态数组来实现,需要使用动态数组...

    matlab函数sum和size用法-matlab函数sum和size用法.doc

    沿着A的每一维计算总和用指定标量dim,dim是一个从1到N的整数值,其中N是A的维数。dim为1就是计算A的每一列的总和,2计算A的每一行的总和,以此类推。 B = sum和B = sum 在双精度下执行相加求和,返回double类型的...

    5.设计一个逻辑算术计算器,用来输入所需的数,并计算结果

    //用来保存double型数据的中间值(vard)和最后结果(answerd) short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算 String copy; //做复制用 JTextArea help; //帮助 ...

    最新JAVA编程题全集_50题及答案

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class lianxi01 { ...

    高精度算法类

    //printf("两数相加结果:\n%s\n",(n1+n2).ToString()); printf("两数相减结果:\n%s\n",(n1-n2).ToString()); //printf("两数相乘结果:\n%s\n",(n1*n2).ToString()); printf("两数相除结果:\n%s\n",(n1/n2)....

    C语言的四则运算问题(不含括号)

    #include #include struct four { double a; struct four *next;...=NULL) //各个节点数值相加的结果,有优先级符号的已经先计算了. { s=s+(p-&gt;a); p=p-&gt;next; } return s; //返回运算结果. }

    整理后java开发全套达内学习笔记(含练习)

    注意:两个 byte 数相加,变 int 型) short 16bit, -2^15~2^15-1 (2^15=32768) int 32bit, -2^31~2^31-1 (2147483648,20亿,10位有效数字) long 64bit, -2^63~2^63-1 (900亿亿,20位有效数字) float 32bit, 9...

    java编写的计算器,能实现加减乘除

    //用来保存double型数据的中间值(vard)和最后结果(answerd) short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算 boolean clear = false; String copy; //做复制...

    达内 coreJava 习题答案

    12、输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值 1 1 2 3 5 8 13 21 34 规律:一个数等于前两个数之和 //计算斐波那契数列(Fibonacci)的第n个值 public class Fibonacci{ public static void main...

    c语言简单计算器

    diaoyong(int a,double e,double f) { printf("请输入你要输入的元素(1-4):\n"); scanf("%d",&a); printf("请输入你要相加的两个元素:\n"); scanf("%lf%lf",&e,&f);

    C语言程序设计标准教程

    C 第二章: 数据类型、运算符、...例如,在前面各例题printf函数的格式串中用到的“\n”就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。 常用的转义字符及其含义...

    一维动态数组实现的矩阵类

    //重载+运算符,矩阵相加 CMatrix& operator+=(const CMatrix &);//重载+=运算符 CMatrix operator-(const CMatrix &)const;//重载- CMatrix& operator-=(const CMatrix &);//重载-=运算符 BOOL operator==...

    java 经典程序50道

    例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 import java.util.*; public class lianxi08 { public static void main(String[] args) { long a , b = 0, sum = 0; Scanner s = new ...

    自定义的矩阵类,内含源码与测试工程

    //重载+运算符,矩阵相加 CMatrix& operator+=(const CMatrix &);//重载+=运算符 CMatrix operator-(const CMatrix &)const;//重载- CMatrix& operator-=(const CMatrix &);//重载-=运算符 BOOL operator==...

    Linux部分C程序

    知道struct的sizeof不是成员类型大小的简单相加,对”对界”问题搞的不是很明白,请高手详细解答一下。 struct A { int a; char b; double c; }; sizeof(A)=? 还有利用#pragma pack设置对齐方式是怎么回事? 字串9

    C语言字符频率统计程序代码

    #include #include struct four { double a; struct four *next;...=NULL) //各个节点数值相加的结果,有优先级符号的已经先计算了. { s=s+(p-&gt;a); p=p-&gt;next; } return s; //返回运算结果. }

Global site tag (gtag.js) - Google Analytics