下面的代碼會打印什麼呢?
public class Change {
public static void main(String[] args) {
System.out.println(2.00 - 1.10);
}
}
打印結果:
打印結果是0.8999999999999,而不是0.90,爲什麼呢?
問題在於1.1這個數字不能被精確地表示爲一個double,因此被表示爲最接近它的值。
更一般地說,問題在於並不是所有的小數都可以用二進制浮點數精確地表示
解決該問題的方法是使用執行精確小數運算的BigDecimal.一定要用BigDecimal(String)構造器,而千萬不要用BigDecimal(double)。後一個構造器將用他的參數的精確值來創建一個實例。
正確使用BigDecimal就可以打印出我們想要的結果
缺點就是這個解決方案運行起來可能沒有基本數據類型快
總之,在需要精確答案的地方,要避免使用double,float.對於貨幣計算,要使用int,long或者BigDecimal.