使用BigDecimal数字进行舍入

Meh*_*hdi 36 java rounding bigdecimal

我想设置两个BigDecimal数字ab.如在这个例子中:

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);
Run Code Online (Sandbox Code Playgroud)

当我运行时,我有这个例外:

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)
Run Code Online (Sandbox Code Playgroud)

为什么需要舍入?如果我不想解决,请问什么是解决方案?

谢谢

bra*_*ain 34

您有两个BigDecimal数字,这两个数字都需要超过1000个小数位.试图将比例设置为仅有113个小数位意味着您将失去精度,因此您需要舍入.

您可以使用采用RoundingMode的setScale方法来防止异常,但不能使用舍入.


Ako*_*tha 14

尝试使用setScale方法的roudingMode.

就像是:

BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);
Run Code Online (Sandbox Code Playgroud)

  • 我认为枚举应该是 RoundingMode.HALF_DOWN (2认同)

Hao*_*hun 6

舍入是必要的.

Javadoc中的BigDecimal,它说BigDecimal被表示为(×unscaledValue 10 进制),其中unscaledValue是一个arbitatrily长整数和规模是一个32位的整数.

2.6*10 -1095需要至少1096的比例才能准确表示.它不能用(任何整数)*10 -113准确表示.因此,您需要提供一个roundingMode.