Rounding necessary with BigDecimal numbers

JavaRoundingBigdecimal

Java Problem Overview


I want to set scale of two BigDecimal numbers a and b . as in this example :

BigDecimal a = new BigDecimal("2.6E-1095");
        BigDecimal b = new BigDecimal("2.7E-1105");
        int i = 112, j=1;

        BigDecimal aa = a.setScale(i+j);
        BigDecimal bb = b.setScale(i+j);

and when i run i have this exception:

java.lang.ArithmeticException: Rounding necessary
	at java.math.BigDecimal.divideAndRound(BigDecimal.java:1439)
	at java.math.BigDecimal.setScale(BigDecimal.java:2394)
	at java.math.BigDecimal.setScale(BigDecimal.java:2437)

Why rounding is necessary ? if i don't want to make around, what is solution please ?

Thanks

Java Solutions


Solution 1 - Java

You have two BigDecimal numbers both of which require over a 1000 decimal places. Trying to set the scale to only have 113 decimal places means you will lose precision and therefore you need to round.

You can use the setScale methods that take a RoundingMode to prevent the exception but not the rounding.

Solution 2 - Java

Try to use roudingMode of setScale method.

Some thing like:

BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);

Solution 3 - Java

Rounding is necessary.

In javadoc for BigDecimal, it says BigDecimal is represented as (unscaledValue × 10-scale), where unscaledValue is an arbitatrily long integer and scale is a 32-bit integer.

2.6*10-1095 requires a scale of at least 1096 to represent accurately. It can not be represented accurately with (any integer)*10-113. Therefore, you need to providing a roundingMode.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMehdiView Question on Stackoverflow
Solution 1 - JavabrainView Answer on Stackoverflow
Solution 2 - JavaAkosthaView Answer on Stackoverflow
Solution 3 - JavaHaozhunView Answer on Stackoverflow