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++) { <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
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 不定长数组:vector
- 下一篇: 关于double类型的数据算法失真处理