53

a2 つの BigDecimal 数値とのスケールを設定したいb。この例のように:

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

2 つの 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では、 (unscaledValue×10 -scaleBigDecimalとして表されます。ここで、は任意の長整数で、scaleは32ビット整数です。unscaledValue

2.6 * 10 -1095を正確に表すには、少なくとも1096のスケールが必要です。(任意の整数)* 10-113では正確に表現できません。したがって、を提供する必要がありますroundingMode

于 2012-05-24T09:11:43.803 に答える