6 Common BigDecimal Mistakes in Java and How to Avoid Them
This article explains six typical pitfalls when using Java's BigDecimal—such as initializing with floating‑point literals, ignoring scale in division, misusing equals, misunderstanding scale, overlooking immutability, and performance costs—and provides clear code examples and best‑practice solutions to prevent precision loss and inefficiency.
Introduction
In everyday development many developers use BigDecimal for precise calculations such as money, fractions, or ratios. Although it is more accurate than double or float, misuse can cause precision loss.
1. Initializing with a floating‑point literal
Creating a BigDecimal with a double value introduces the binary representation error.
BigDecimal num = new BigDecimal(0.1);
System.out.println(num);The output shows a long decimal expansion. The correct approach is to pass a string or use BigDecimal.valueOf:
BigDecimal num = new BigDecimal("0.1");
System.out.println(num);2. Omitting precision in division
Using divide without specifying scale causes ArithmeticException for non‑terminating decimals.
BigDecimal c = new BigDecimal("10");
BigDecimal d = new BigDecimal("3");
BigDecimal result = c.divide(d);Fix by providing scale and rounding mode:
BigDecimal result = c.divide(d, 2, RoundingMode.HALF_UP);
System.out.println(result);3. Using equals to compare values
equalschecks both value and scale, so new BigDecimal("1.0") and new BigDecimal("1.00") are not equal.
System.out.println(x.equals(y)); // false
System.out.println(x.compareTo(y) == 0); // true4. Misunderstanding scale and precision
Calling scale() on a number with trailing zeros may give unexpected results after stripTrailingZeros(). Use setScale when you need a fixed number of decimal places.
BigDecimal fixed = num.setScale(2, RoundingMode.HALF_UP);
System.out.println(fixed);5. Ignoring immutability
Methods like add return a new instance; the original object is unchanged.
BigDecimal sum = new BigDecimal("0");
for (int i = 0; i < 5; i++) {
sum = sum.add(new BigDecimal("1"));
}
System.out.println(sum);6. Overlooking performance
BigDecimal is precise but slower. For massive calculations, prefer integer arithmetic (e.g., cents) or use double and convert the final result to BigDecimal.
double principal = 10000;
double rate = 0.05;
BigDecimal interest = BigDecimal.valueOf(principal * rate);
System.out.println(interest);Conclusion
BigDecimal is a powerful tool, but it requires careful handling of initialization, scale, comparison, immutability, and performance to avoid common pitfalls.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Su San Talks Tech
Su San, former staff at several leading tech companies, is a top creator on Juejin and a premium creator on CSDN, and runs the free coding practice site www.susan.net.cn.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
