先看下面的例子:
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