1

BegDecimal2 つの数値を除算する次のアプローチは正常に機能します。

BigDecimal a=new BigDecimal(5);
BigDecimal b=new BigDecimal(2);
System.out.println(a.divide(b));

出力:2.5


ただし、次の同じアプローチは失敗しますjava.lang.ArithmeticException

BigDecimal c=new BigDecimal(361);
BigDecimal d=new BigDecimal(6);
System.out.println(c.divide(d));

以下は、完全な例外スタック トレースです。

Exception in thread "main" java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1603)
    at currenttime.Main.main(Main.java:15)
Java Result: 1

解決策は何ですか?

4

3 に答える 3

2

これは、Java 仕様で想定されているとおりです。スケールを提供していないため、361/6 = 60.1(6) であるため、その例外をスローする必要があります。丸めが必要な場合は、スケールを指定する必要があります。つまり、小数点以下の桁数を返すか、リマインダーで除算するために devidAndReminder が必要になる場合があります。

于 2012-07-28T23:21:05.620 に答える
2

たとえば、小数点以下 5 桁に丸めることができます。

BigDecimal c=new BigDecimal(361);
BigDecimal d=new BigDecimal(6);
System.out.println(c.divide(d, 5, BigDecimal.ROUND_HALF_EVEN));
于 2012-07-28T23:25:24.343 に答える
1

1 つの引数は、商が非終了小数 (361/6 は 60.1666666...)BigDecimal.Divideの場合にスローします。ArithmeticException

例外:
ArithmeticException - 正確な商に終了小数展開がない場合

これを回避するにはoverload、 を 2 番目のRoundingModeパラメータとともに使用します。

つまり、除算の結果から何を期待するかを正確に BigDecimal に伝えます。

于 2012-07-28T23:19:11.123 に答える