BigDecimal 是一個用於高精度算術運算的類,提供了多種方法來比較兩個 BigDecimal 對象是否相等。

為什麼不推薦使用 ==

首先,需要明確一點:不要使用 == 運算符來比較 BigDecimal 對象

原因如下:

  • == 比較的是對象的引用(內存地址),而不是對象的值。
  • 即使兩個 BigDecimal 對象的值相同,它們也可能是不同的對象,因此 == 會返回 false

示例:

BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("10");

System.out.println(a == b); // 輸出: false (因為 a 和 b 是不同的對象)

正確的比較方法

BigDecimal 類提供了專門的方法來比較對象的值。

1. 使用 equals() 方法

equals() 方法用於比較兩個 BigDecimal 對象的值和精度是否完全相同。

特點:

  • 當且僅當兩個 BigDecimal 對象的值相等且精度相同時,equals() 才返回 true
  • 如果值相同但精度不同,equals() 返回 false

示例:

BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("10.0");

System.out.println(a.equals(b)); // 輸出: false (值相同,但精度不同)

BigDecimal c = new BigDecimal("10.00");
BigDecimal d = new BigDecimal("10.00");

System.out.println(c.equals(d)); // 輸出: true (值和精度都相同)
2. 使用 compareTo() 方法

compareTo() 方法用於比較兩個 BigDecimal 對象的數值大小,並返回一個整數:

  • 如果調用對象小於參數對象,返回 -1
  • 如果調用對象等於參數對象,返回 0
  • 如果調用對象大於參數對象,返回 1

特點:

  • compareTo() 只關心數值本身是否相等,不關心精度。
  • 這是最常用的比較 BigDecimal 數值是否相等的方法。

示例:

BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("10.0");
BigDecimal c = new BigDecimal("11");

System.out.println(a.compareTo(b)); // 輸出: 0 (數值相等)
System.out.println(a.compareTo(c)); // 輸出: -1 (a 小於 c)

判斷數值是否相等的標準寫法:

if (a.compareTo(b) == 0) {
    // 數值相等
} else {
    // 數值不相等
}

總結

方法

用途

注意事項

==

比較對象引用

不推薦用於比較 BigDecimal 的值

equals()

比較值和精度

精度不同時,即使值相同也返回 false

compareTo()

比較數值大小

只關心數值,不關心精度,是比較數值相等的推薦方法

在實際開發中,如果想判斷兩個 BigDecimal 的數值是否相等,使用 compareTo() 方法,並檢查其返回值是否為 0