## 1.概述

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.对问题的介绍

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.BigDecimal比较的常见陷阱。使用equals方法

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:

``assertThat(BigDecimal.ZERO.equals(BD1)).isTrue();``

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:

``assertThat(BigDecimal.ZERO.equals(BD2)).isTrue();``

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.使用compareTo方法

The BigDecimal class implements the Comparable interface. So, we can use the compareTo method to compare two BigDecimal objects’ values.

BigDecimal类实现了Comparable接口。因此，我们可以使用compareTo方法来比较两个BigDecimal对象的值。

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:

``````assertThat(BigDecimal.ZERO.compareTo(BD1)).isSameAs(0);
assertThat(BigDecimal.ZERO.compareTo(BD2)).isSameAs(0);``````

When we run the test, it passes. So, we’ve solved the problem using the compareTo method.

## 5.使用signum方法

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.

BigDeicmal类提供了signum方法来告诉给定的BigDecimal对象的值是负数（-1）、零（0）还是正数（1）signum方法将忽略刻度属性。

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:

``````assertThat(BD1.signum()).isSameAs(0);
assertThat(BD2.signum()).isSameAs(0);``````

The test above passes if we give it a run.

## 6.结语

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.