1. 程式人生 > 實用技巧 >浮點數之間的等值判斷,基本資料型別不能用==來比較,包裝資料型別不能用equals來判斷

浮點數之間的等值判斷,基本資料型別不能用==來比較,包裝資料型別不能用equals來判斷

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