ArithmeticException for BigDecimal

The BigDecimal class is designed for high-precision arithmetic, especially when dealing with monetary or scientific calculations. However, despite its flexibility, ArithmeticException can still occur — most notably when the result of an operation cannot be represented exactly under the conditions provided (e.g., during division without a specified rounding mode).

Why Does ArithmeticException Occur with BigDecimal?

The most common reason is division with an infinite or non-terminating decimal result without specifying a rounding mode.

For example, dividing 1 by 3 results in 0.333..., which is non-terminating. If you do this without specifying how to round the result, Java throws an ArithmeticException.

Common Scenario Triggering ArithmeticException

import java.math.BigDecimal;

public class BigDecimalExceptionExample {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("1");
        BigDecimal b = new BigDecimal("3");

        // This line will throw ArithmeticException
        BigDecimal result = a.divide(b);

        System.out.println("Result: " + result);
    }
}
/*
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
*/

How to Avoid ArithmeticException in BigDecimal

We can avoid this by providing a scale and a rounding mode:

import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalSafeDivision {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("1");
        BigDecimal b = new BigDecimal("3");

        BigDecimal result = a.divide(b, 5, RoundingMode.HALF_UP); // Rounds to 5 decimal places
        System.out.println("Result: " + result);
    }
}
/*
Result: 0.33333
*/

We can also use the MathContext class for controlling precision and rounding:

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;

public class MathContextDivision {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("1");
        BigDecimal b = new BigDecimal("3");

        MathContext mc = new MathContext(4, RoundingMode.HALF_UP); // 4 significant digits
        BigDecimal result = a.divide(b, mc);
        System.out.println("Result: " + result);
    }
}
/*
Result: 0.3333
*/

BigDecimal throws ArithmeticException when an exact result is not possible, especially in division.Always use divide() with a specified scale and rounding mode or a MathContext to avoid surprises.Avoid RoundingMode.UNNECESSARY unless you’re sure rounding won’t be required.Proper use of BigDecimal ensures accurate, reliable arithmetic in sensitive domains like finance, statistics, and science.

Scroll to Top