Overview
In this tutorial, we show you how to fix the error messages "java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result." when we use java.math.BigDecimal to divide two values.Watch Tutorial
Error Messages
The following simple code snippet demonstrates the error messagespackage com.jackrutorial; import java.math.BigDecimal; public class Test { public static void main(String[] args) { BigDecimal num1 = new BigDecimal("10"); BigDecimal num2 = new BigDecimal("3"); BigDecimal result = num1.divide(num2); System.out.println(result); } }
When the above code is executed, the expected exception is encountered as the following error messages
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(BigDecimal.java:1690) at com.jackrutorial.Test.main(Test.java:11)
How to fix those error messages?
You have to modify the source code belowWay 1:
BigDecimal result = num1.divide(num2, 2, RoundingMode.HALF_DOWN);
2 is scale of the BigDecimal quotient to be returned.
RoundingMode.HALF_DOWN is Rounding mode to apply. The Rounding Mode Enum constants are UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP, and UNNECESSARY.
The updated Test class will have the following code:
package com.jackrutorial; import java.math.BigDecimal; import java.math.RoundingMode; public class Test { public static void main(String[] args) { BigDecimal num1 = new BigDecimal("10"); BigDecimal num2 = new BigDecimal("3"); BigDecimal result = num1.divide(num2, 2, RoundingMode.HALF_DOWN); System.out.println(result); } }
The output of the above code is
3.33
Way 2:
num1.divide(num2, MathContext.DECIMAL128)MathContext.DECIMAL32
MathContext.DECIMAL64
MathContext.DECIMAL128
package com.jackrutorial; import java.math.BigDecimal; import java.math.RoundingMode; public class Test { public static void main(String[] args) { BigDecimal num1 = new BigDecimal("10"); BigDecimal num2 = new BigDecimal("3"); BigDecimal result = num1.divide(num2, MathContext.DECIMAL128); System.out.println(result); } }
The output of the above code is
3.333333333333333333333333333333333