浮點數之間的等值判斷,基本數據類型不能用==來比較,包裝數據類型不能用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"); }