Rounding necessary with BigDecimal numbers

时间秒杀一切 提交于 2019-12-21 03:08:12

问题


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


回答1:


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.




回答2:


Try to use roudingMode of setScale method.

Some thing like:

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



回答3:


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.



来源:https://stackoverflow.com/questions/10734230/rounding-necessary-with-bigdecimal-numbers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!