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

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM