關於BigDecimal的大坑

  • 背景:

判斷金額爲0狀況下,不處理業務;json

  • 問題

業務數據是一個快照(json格式存儲),其中有一個金額爲0.00,轉換爲對象中的某個屬性(BigDecimal類型) 後 用ide

BigDecimal.ZERO.equals(amount)

判斷 出問題,二者不等。this

先看BigDecimal equals 源碼:spa

@Override
public boolean equals(Object x) {
    if (!(x instanceof BigDecimal))
        return false;
    BigDecimal xDec = (BigDecimal) x;
    if (x == this)
        return true;
    if (scale != xDec.scale)
        return false;
    long s = this.intCompact;
    long xs = xDec.intCompact;
    if (s != INFLATED) {
        if (xs == INFLATED)
            xs = compactValFor(xDec.intVal);
        return xs == s;
    } else if (xs != INFLATED)
        return xs == compactValFor(this.intVal);

    return this.inflated().equals(xDec.inflated());
}

首先根據地址,而後根據精度判斷。debug

再來看看下面幾個判斷:對象

debug 狀態下比較:ci

  • 解決方案:

用b.compareTo(BigDecimal.ZERO)==0,能夠比較是否等於0源碼

compareTo方法:bug

  • 結論:

對於BigDecimal的大小比較,用equals方法的話會不只會比較值的大小,還會比較兩個對象的精確度,而compareTo方法則不會比較精確度,只比較數值的大小方法

相關文章
相關標籤/搜索