牛骨文教育服务平台(让学习变的简单)
博文笔记

n 个double相加的问题

创建时间:2011-09-26 投稿人: 浏览次数:4509

 先看下面的例子:

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++)
		{
		  <SPAN style="COLOR: #ff0000">  BigDecimal b1=new BigDecimal(Double.toString(sum));
                                    BigDecimal b2=new BigDecimal(Double.toString(temp));
</SPAN>                                    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

 

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。