Fundamentals 8 min read

Understanding BigDecimal.equals: How Value and Scale Affect Equality in Java

This article explains why Java's BigDecimal.equals method compares both numeric value and scale, demonstrates common pitfalls with == and equals, shows experimental results for different constructors, and recommends using compareTo for value‑only comparisons to avoid unexpected false outcomes.

Full-Stack Internet Architecture
Full-Stack Internet Architecture
Full-Stack Internet Architecture
Understanding BigDecimal.equals: How Value and Scale Affect Equality in Java

BigDecimal is a Java class for high‑precision arithmetic, widely used in finance, e‑commerce, and other domains that require exact decimal calculations.

Many developers mistakenly compare BigDecimal objects with == or assume that BigDecimal.equals() only checks the numeric value, which leads to subtle bugs.

An experiment creates several BigDecimal instances and prints the results of equals():

BigDecimal bigDecimal = new BigDecimal(1);
BigDecimal bigDecimal1 = new BigDecimal(1);
System.out.println(bigDecimal.equals(bigDecimal1)); // true

BigDecimal bigDecimal2 = new BigDecimal(1);
BigDecimal bigDecimal3 = new BigDecimal(1.0);
System.out.println(bigDecimal2.equals(bigDecimal3)); // true

BigDecimal bigDecimal4 = new BigDecimal("1");
BigDecimal bigDecimal5 = new BigDecimal("1.0");
System.out.println(bigDecimal4.equals(bigDecimal5)); // false

The output shows true, true, and false, illustrating that equals() can return false when the scales differ.

The Javadoc clarifies that BigDecimal.equals() returns true only if both the value and the scale are identical; therefore 2.0 is not equal to 2.00 under this method.

BigDecimal provides four constructors, each assigning a different scale:

BigDecimal(int)
BigDecimal(long)
BigDecimal(double)
BigDecimal(String)

Constructors with int or long set the scale to 0. The double constructor creates a binary approximation, e.g., new BigDecimal(0.1) becomes 0.1000000000000000055511151231257827021181583404541015625, giving it a large scale. The String constructor preserves the exact decimal representation and its scale, so new BigDecimal("0.1") has a scale of 1.

Because equals() also checks scale, new BigDecimal("1") and new BigDecimal("1.0") are considered unequal, while new BigDecimal(1) and new BigDecimal(1.0) are equal (both have scale 0).

When only the numeric value matters, use compareTo(), which ignores scale and returns 0 for equal values:

BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("1.0000");
System.out.println(a.compareTo(b)); // 0

In summary, BigDecimal.equals() is strict—it compares both value and scale—so developers should either choose constructors that give the intended scale or prefer compareTo() for value‑only equality checks.

BigDecimal illustration
BigDecimal illustration
Diagram
Diagram
equals source code
equals source code
scale illustration
scale illustration
compareTo source
compareTo source
Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

javaprecisionBigDecimalequalsScalecompareTonumeric
Full-Stack Internet Architecture
Written by

Full-Stack Internet Architecture

Introducing full-stack Internet architecture technologies centered on Java

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.