在 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 上找到。