使用BigDecimal数字进行舍入

问题描述 投票:34回答:3

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

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

谢谢

java rounding bigdecimal
3个回答
31
投票

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

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


14
投票

尝试使用setScale方法的roudingMode。

就像是:

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

5
投票

舍入是必要的。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.