浮點數之間的等值判斷

浮點數之間的等值判斷,基本數據類型不能用==來比較,包裝數據類型不能用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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章