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