web-dev-qa-db-ja.com

BigDecimal数での丸めが必要

2つの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)

なぜ丸めが必要ですか?私が周りを作りたくない場合、解決策は何ですか?

ありがとう

35
Mehdi

2つのBigDecimal番号があり、どちらも小数点以下1000桁以上が必要です。スケールを小数点以下113桁のみに設定しようとすると、精度が失われるため、丸める必要があります。

RoundingModeを使用するsetScaleメソッドを使用して、例外を防ぐことができますが、丸めはできません。

32
brain

SetScaleメソッドのroudingModeを使用してみてください。

何かのようなもの:

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

丸めが必要です。

BigDecimalのjavadoc では、BigDecimalは(unscaledValue×10-規模)、ここでunscaledValueは任意の長さの整数であり、scaleは32ビット整数です。

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

6
Haozhun