使用BigDecimal数字时是否需要四舍五入

62

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

为什么需要四舍五入?如果我不想进行四舍五入,有什么解决方案吗?

谢谢


1
确实这是一个惊喜。在没有查看文档的情况下,我预期将比例设置为截断比例... - Brian Knoblauch
我也预期会出现同样的情况。即使指定了RoundingMode.ROUNDING_UNNECESSARY,也会出现此异常。我没有看到截断选项,但希望有这个功能。 - wheeleruniverse
3个回答

45

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

您可以使用带有RoundingMode参数的setScale方法来防止异常但无法进行舍入。


31

尝试使用 setScale 方法的舍入模式。

类似于:

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

4
我认为枚举应该是 RoundingMode.HALF_DOWN。 - abbas

9

需要进行四舍五入。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接