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