檢查 BigDecimal 值是否為零
一、概述
當我們想在 Java 中進行十進制數計算時,我們可以考慮使用BigDecimal類。
在這個簡短的教程中,我們將探討如何檢查BigDecimal對象的值是否為零。
2. 問題介紹
這個問題其實很簡單。假設我們有一個非空BigDecimal對象。我們想知道它的值是否等於零。
敏銳的眼睛可能已經意識到,“它的值whether its value is equal to zero ”這個要求已經暗示了解決方案:使用equals()方法。此外, BigDecimal類提供了一個方便的ZERO常量對象來指示零值。
的確,這個問題聽起來很簡單。我們可以簡單地檢查BigDecimal.ZERO.equals(givenBdNumber)來確定givenBdNumber對象的值是否為零。但是,如果我們不知道BigDeicmal的比較複雜性,我們可能會陷入一個常見的陷阱。
接下來,讓我們仔細看看它並提出解決它的正確方法。
3. BigDecimal比較的常見陷阱:使用equals方法
首先,讓我們創建一個以零為值的BigDecimal對象:
BigDecimal BD1 = new BigDecimal("0");
現在,讓我們使用equals方法檢查BD1的值是否為零。為簡單起見,讓我們在單元測試方法中執行此操作:
assertThat(BigDecimal.ZERO.equals(BD1)).isTrue();
如果我們運行測試,它將通過。到目前為止,一切都很好。我們可能認為這是解決方案。接下來,讓我們創建另一個BigDecimal對象:
BigDecimal BD2 = new BigDecimal("0.0000");
顯然, BD2對象的值是零,儘管我們已經用一個比例為四的字符串構造了它。眾所周知,0.0000 與 0 的值相同。
現在,讓我們再次使用equals方法測試 BD2:
assertThat(BigDecimal.ZERO.equals(BD2)).isTrue();
這一次,如果我們運行該方法,出乎意料的是,測試將失敗。
這是因為BigDecimal對象具有 value 和 scale 屬性。此外, equals方法僅在兩個BigDecimal對象的 value 和 scale 相等時才認為它們相等。也就是說,如果我們將它們與equals進行比較, BigDecimal 42 不等於 42.0。
另一方面, BigDecimal.ZERO常量的值為零,刻度也為零。因此,當我們檢查“ 0 equals 0.0000 ”時, equals方法返回false 。
因此,我們需要找到一種方法,只比較兩個BigDecimal對象的值,而忽略它們的比例。
接下來,讓我們看看解決問題的幾種方法。
4. 使用compareTo方法
BigDecimal類實現了Comparable接口。因此,我們可以使用compareTo方法來比較兩個BigDecimal對象的值。
此外, compareTo方法的 Javadoc 明確指出:
此方法認為兩個值相等但比例不同(如 2.0 和 2.00)的
BigDecimal對像是相等的。
因此,**我們可以檢查BigDecimal.ZERO.compareTo(givenBdNumber) == 0**來確定 givenBdNumber 的值是否為零。
接下來,讓我們測試一下這個方法是否能正確判斷BigDecimal對象BD1和BD2是否都為零:
assertThat(BigDecimal.ZERO.compareTo(BD1)).isSameAs(0);
assertThat(BigDecimal.ZERO.compareTo(BD2)).isSameAs(0);
當我們運行測試時,它通過了。所以,我們已經使用compareTo方法解決了這個問題。
5.使用signum方法
BigDeicmal類提供了[signum](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#signum())方法來判斷給定BigDecimal對象的值是負 (-1)、零 (0) 還是正 (1) 。 signum方法將忽略 scale 屬性。
因此,我們可以通過檢查(givenBdNumber.signum() == 0)來解決問題。
同樣,讓我們編寫一個測試來驗證這種方法是否適用於兩個示例:
assertThat(BD1.signum()).isSameAs(0);
assertThat(BD2.signum()).isSameAs(0);
如果我們試一試,上面的測試就通過了。
六,結論
在這篇簡短的文章中,我們討論了兩種檢查BigDecimal對象的值是否為零的正確方法: compareTo方法或signum方法。
像往常一樣,本文的完整代碼可以在 GitHub 上找到。