How to check if BigDecimal variable == 0 in java?
I have the following code in Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
What is the best way to write the if condition?
Solution 1:
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.
Note!
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
Solution 2:
Alternatively, signum() can be used:
if (price.signum() == 0) {
return true;
}
Solution 3:
There is a constant that you can check against:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
Solution 4:
Alternatively, I think it is worth mentioning that the behavior of equals and compareTo methods in the class BigDecimal are not consistent with each other.
This basically means that:
BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO) == 0); // true
System.out.println(someValue.equals(BigDecimal.ZERO)); // false
Therefore, you have to be very careful with the scale in your someValue
variable, otherwise you would get unexpected results.
Solution 5:
I usually use the following:
if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }