表達式之謎——找零時刻

下面的代碼會打印什麼呢?

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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章