I have the following code in Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal(\"0.00\")) == 0) {
return true;
}
<
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
Use compareTo(BigDecimal.ZERO) instead of equals():
if (price.compareTo(BigDecimal.ZERO) == 0) // see below
Comparing with the BigDecimal constant BigDecimal.ZERO avoids having to construct a new BigDecimal(0)
every execution.
FYI, BigDecimal
also has constants BigDecimal.ONE and BigDecimal.TEN for your convenience.
The reason you can't use BigDecimal#equals() is that it takes scale into consideration:
new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!
so it's unsuitable for a purely numeric comparison. However, BigDecimal.compareTo() doesn't consider scale when comparing:
new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true
Alternatively, signum() can be used:
if (price.signum() == 0) {
return true;
}
Just want to share here some helpful extensions for kotlin
fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0
There is a constant that you can check against:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0