When we want to do decimal number calculations in Java, we may consider using the BigDecimal class.
In this short tutorial, we'll explore how to check if a BigDecimal object's value is zero.
2. Introduction to the Problem
The problem is actually pretty straightforward. Let's say we have a not-null BigDecimal object. We want to know whether its value is equal to zero.
Sharp eyes may have already realized that the requirement “whether its value is equal to zero” has implied the solution: using the equals() method. Further, the BigDecimal class provides a convenient ZERO constant object to indicate the zero value.
Indeed, this problem sounds pretty simple. We could simply check BigDecimal.ZERO.equals(givenBdNumber) to decide if the givenBdNumber object has the value zero. However, if we don't know BigDeicmal‘s comparison intricacies, we may fall into a common pitfall.
Next, let's take a closer look at it and address the proper ways to solve it.
3. The Common Pitfall of BigDecimal Comparison: Using the equals Method
First, let's create a BigDecimal object with zero as the value:
BigDecimal BD1 = new BigDecimal("0");
Now, let's check if BD1‘s value is zero using the equals method. For simplicity, let's do this in a unit test method:
If we run the test, it'll pass. So far, so good. We may think it's the solution. Next, let's create another BigDecimal object:
BigDecimal BD2 = new BigDecimal("0.0000");
Apparently, the BD2 object's value is zero, although we've constructed it by a string with a scale of four. As we all know, 0.0000 is the same as 0 in value.
Now, let's test BD2 with the equals method again:
This time, if we run the method, surprisingly, the test will fail.
This is because a BigDecimal object has value and scale attributes. Moreover, the equals method considers two BigDecimal objects equal only if they are equal in both value and scale. That is to say, BigDecimal 42 is not equal to 42.0 if we compare them with equals.
On the other side, the BigDecimal.ZERO constant has the value zero and a scale of zero, too. So, when we check “0 equals 0.0000“, the equals method returns false.
Therefore, we need to find a way only to compare two BigDecimal objects' values but ignore their scales.
Next, let's see a couple of approaches to solve the problem.
4. Using the compareTo Method
The BigDecimal class implements the Comparable interface. So, we can use the compareTo method to compare two BigDecimal objects' values.
Further, the compareTo method's Javadoc clearly states:
Two BigDecimal objects that are equal in value but have a different scale (like 2.0 and 2.00) are considered equal by this method.
Therefore, we can check BigDecimal.ZERO.compareTo(givenBdNumber) == 0 to decide if givenBdNumber has the value zero.
Next, let's test if this method can correctly tell if both BigDecimal objects BD1 and BD2 are zero:
When we run the test, it passes. So, we've solved the problem using the compareTo method.
5. Using the signum Method
The BigDeicmal class provides the signum method to tell if the given BigDecimal object's value is negative (-1), zero (0), or positive (1). The signum method will ignore the scale attribute.
Therefore, we can solve the problem by checking (givenBdNumber.signum() == 0).
Again, let's write a test to verify if this approach works for the two examples:
The test above passes if we give it a run.
In this short article, we've addressed two proper ways to check if a BigDecimal object's value is zero: the compareTo method or the signum method.
As usual, the complete code of this article can be found over on GitHub.
res – REST with Spring (eBook) (everywhere)