關於java float類型的比較

關於java的浮點類型處理,一般處理計算會想到使用BigDecemal,但是如果是比較呢?

可能會直接使用==,>等符號直接進行比較運算。可以執行下面的代碼查看結果: 

public static void main(String[] args) {
        computer(2.00023434239f, 2.00023434233f);
        System.out.println("--------------------------------");
        computer(2.00023f,2.00022f);
    }


    public static void computer(float f1, float f2) {
        System.out.println("使用==比較結果:" + (f1 == f2));
        System.out.println("使用Math.abs() > 0比較:" + (Math.abs(f1 - f2) > 0));
        System.out.println("使用Math.abs() < 0比較:" + (Math.abs(f1 - f2) < 0));
        System.out.println("使用Math.abs() = 0比較:" + (Math.abs(f1 - f2) == 0));
        System.out.println("使用>比較:" + (f1 > f2));
        System.out.println("使用<比較:" + (f1 < f2));
    }
使用==比較結果:true
使用Math.abs() > 0比較:false
使用Math.abs() < 0比較:false
使用Math.abs() = 0比較:true
使用>比較:false
使用<比較:false
--------------------------------
使用==比較結果:false
使用Math.abs() > 0比較:true
使用Math.abs() < 0比較:false
使用Math.abs() = 0比較:false
使用>比較:true
使用<比較:false

結果很奇怪。

 爲什麼第一次調用computer的結果會和想的不一樣,但是第二次調用和正常的一樣。

可以看到兩次調用的參數小數點後的位數不一樣,很自然的可以想到是精度的問題。所以使用java的浮點類型進行比較的時候不能直接比較。

斷點查看兩個參數,可以看到小數點後六位是正確的,之後的精度都丟失了。 

float的小數位只有23位,即二進制的23位,能表示的最大的十進制數爲2的23次方,即8388608,即十進制的7位,嚴格點,精度只能百分百保證十進制的6位運算。

double的小數位有52位,對應十進制最大值爲4 503 599 627 370 496,這個數有16位,所以計算精度只能百分百保證十進制的15位運算。

 

參考資料:

https://blog.csdn.net/tianmd_Eric/article/details/79729827

 

發佈了33 篇原創文章 · 獲贊 0 · 訪問量 6186
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章