浮點數之間的等值判斷,基本資料型別不能用==來比較,包裝資料型別不能用equals來判斷
阿新 • • 發佈:2021-01-19
浮點數之間的等值判斷,基本資料型別不能用==來比較,包裝資料型別不能用equals來判斷。
說明:浮點數採用“尾數+階碼”的編碼方式,類似於科學計數法的“有效數字+指數”的表示方式。
二進位制無法精確表示大部分的十進位制小數,具體原理參考《碼出高效》。
反例:
float a =1.0f-0.9f; float b =0.9f-0.8f;
if(a == b){ // 預期進入此程式碼快,執行其它業務邏輯 // 但事實上a==b的結果為false } Float x = Float.valueOf(a); Float y = Float.valueOf(b); if(x.equals(y)){// 預期進入此程式碼快,執行其它業務邏輯 // 但事實上equals的結果為false }
正例:
(1) 指定一個誤差範圍,兩個浮點數的差值在此範圍之內,則認為是相等的。
float a =1.0f-0.9f; float b =0.9f-0.8f; float diff =1e-6f; if(Math.abs(a -b)<diff){ System.out.println("true"); }
(2) 使用BigDecimal來定義值,再進行浮點數的運算操作。
BigDecimal a =new BigDecimal("1.0"); BigDecimal b =new BigDecimal("0.9"); BigDecimal c =new BigDecimal("0.8"); BigDecimal x = a.subtract(b); BigDecimal y = b.subtract(c); if(x.equals(y)){ System.out.println("true"); }