使用BigDecimal数字进行舍入

时间:2012-05-24 08:58:44

标签: 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);

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

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)

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

由于

3 个答案:

答案 0 :(得分:31)

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

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

答案 1 :(得分:14)

尝试使用setScale方法的roudingMode。

有些事情:

firefox_capabilities['binary']

答案 2 :(得分:5)

舍入是必要的。

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

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