53

我想设置两个 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);

当我跑步时,我有这个例外:

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)

为什么需要四舍五入?如果我不想到处走走,请问有什么解决办法?

谢谢

4

3 回答 3

40

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

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

于 2012-05-24T09:07:19.877 回答
26

尝试使用 setScale 方法的 roudingMode。

就像是:

BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);
于 2016-06-15T18:20:43.177 回答
8

四舍五入是必要的。

BigDecimal 的 javadoc 中,它表示BigDecimal表示为 (unscaledValue × 10 -scale ),其中unscaledValue是一个任意长的整数,而 scale 是一个 32 位整数。

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

于 2012-05-24T09:11:43.803 回答