BigDecimal比較建議用compareTo

前言

前兩天測試發現一個Bug,告訴我說他明明只修改了訂單詳情中商品的數量,爲何提示說訂單中商品單價不能修改(後臺限制了特殊單子的單價不能修改),可是他明明沒有修改商品的單價,這就很奇怪了。我看了下入參,修改接口傳的該商品的單價爲price=222,數據庫中該商品的單價爲222.000000。該字段爲BigDecimal類型,除了精度不同,值是相等的,然後臺校驗相等用的是equals。而網上查資料BigDecimal用的比較多的是compareTo方法。數據庫

測試兩種比較

public class BigDecimalDemo {

    public static void main(String [] args) {
        BigDecimal decimal1 = new BigDecimal("222");
        BigDecimal decimal2 = new BigDecimal("222.000000");
        System.out.println(decimal1.equals(decimal2));
        System.out.println(decimal1.compareTo(decimal2));
    }
}
複製代碼

運行結果bash

運行結果不出所料,BigDecimal的equals方法當精度不同的時候也當作不相等,而compareTo方法卻能夠忽略精度的不一樣,只比較數值是否相同。

看看源碼

BigDecimal的equals方法

源碼裏說的很詳細,equals方法比較value和scale(數值和精度),精度不同,也返回false。

BigDecimal的compareTo方法

compareTo也說得很詳細,數值相同可是精度不一樣的兩個數(例如2.0和2.00)被認爲是相等的兩個數,返回0。 另外對於a.compareTo(b)方法

  • a<b, 返回-1
  • a=b,返回0
  • a>b, 返回1
相關文章
相關標籤/搜索