在 Java 中將 BigDecimal 乘以整數
一、概述
Integer和BigDecimal是我們日常 Java 編程中常用的兩種數字類型。
在本快速教程中,我們將探討如何將BigDecimal數乘以Integer 。
二、問題介紹
舉個例子可以很快說明問題。假設我們有一個BigDecimal數字和一個整數:
final BigDecimal BIG = new BigDecimal("42.42");
final int INT = 10;
然後我們要計算42.42 x 10的結果作為另一個BigDecimal數:
final BigDecimal EXPECTED = new BigDecimal("424.2");
BigDecimal提供了一套數學計算方法,如add() 、 divide() 、 subtract(), multiply()等。這些方法使我們能夠方便地進行標準的算術計算。但是,我們應該注意,這些方法只能在兩個BigDecimal對象之間進行數學運算。換句話說,它們只接受BigDecimal類型的參數。
因此,我們不能將BigDecimal直接乘以Integer .
接下來,讓我們看看如何進行計算。為簡單起見,我們將使用單元測試斷言來驗證解決方案是否產生了預期的結果。
3. 將Integer轉換為BigDecimal實例
現在我們明白BigDecimal.multiply()只接受BigDecimal數字作為參數。所以,如果我們可以將Integer對象轉換為BigDecimal對象,我們就可以進行乘法計算。
BigDecimal類具有valueOf()方法,它允許我們從Integer中獲取BigDecimal數字:
BigDecimal result = BIG.multiply(BigDecimal.valueOf(INT));
assertEquals(0, EXPECTED.compareTo(result));
如果我們試一試,測試就會通過。所以我們得到了預期的結果。
值得一提的是,除了BigDecimal.valueOf(INT)方法之外,我們還可以使用構造函數new BigDecimal(INT)從Integer中獲取BigDecimal數字。
但是,首選使用valueOf()方法。這是因為BigDecimal類預定義了十一個常用實例:零到十:
ZERO_THROUGH_TEN = new BigDecimal[]{new BigDecimal(BigInteger.ZERO, 0L, 0, 1),
new BigDecimal(BigInteger.ONE, 1L, 0, 1),
new BigDecimal(BigInteger.TWO, 2L, 0, 1),
new BigDecimal(BigInteger.valueOf(3L), 3L, 0, 1),
...
new BigDecimal(BigInteger.TEN, 10L, 0, 2)};
valueOf()方法檢查給定的整數是否在“零到十”範圍內,並嘗試重用預定義的實例。另一方面,調用構造函數總是會創建一個新的BigDecimal實例。
4.關於斷言的一句話
我們編寫了一個測試,它驗證了我們的解決方案是否有效。然而,好奇的眼睛可能會看到這個斷言看起來有點尷尬:
assertEquals(0, EXPECTED.compareTo(result));
我們中的一些人可能想簡化它以提高可讀性:
assertEquals(EXPECTED, result);
但是,如果我們使用上面的斷言運行測試,測試將失敗:
org.opentest4j.AssertionFailedError:
Expected :424.2
Actual :424.20
這是因為**BigDecimal的equals()方法不僅比較兩個BigDecimal數的值,它還檢查兩個BigDecimal數的scale位數:**
public boolean equals(Object x) {
if (x instanceof BigDecimal xDec) {
if (x == this) {
return true;
} else if (this.scale != xDec.scale) {
return false;
} else {
...
}
在我們的例子中,我們只對BigDecimal數字的值感興趣。因此,我們需要調用compareTo()方法。
或者,我們可以使用 AssertJ 的isEqualByComparingTo()方法使代碼更易於閱讀:
assertThat(result).isEqualByComparingTo(EXPECTED);
5.結論
在本文中,我們學習瞭如何將BigDecimal乘以Integer.由於BigDecimal.multiply()只接受BigDecimal對像作為參數,我們需要在調用multiply()方法之前將Integer對象轉換為BigDecimal實例。
與往常一樣,本文中提供的所有代碼片段都可以在 GitHub 上找到。