2

CentOs 5.4、OpenJDKランタイム環境(ビルド1.6.0-b09)

MathContext context = new MathContext(2, RoundingMode.FLOOR);  
BigDecimal total = new BigDecimal("200.0", context);

BigDecimal goodPrice = total.divide(BigDecimal.valueOf(3), 2, RoundingMode.FLOOR);
System.out.println("divided price=" + goodPrice.toPlainString());
// prints 66.66

BigDecimal goodPrice2 = total.divide(BigDecimal.valueOf(3), new MathContext(2,    RoundingMode.FLOOR));
System.out.println("divided price2=" + goodPrice2.toPlainString());
// prints 66

バグ ?

4

3 に答える 3

9

最初の状況の Javadoc:

値が (this / divisor) で、スケールが指定された BigDecimal を返します。指定したスケールで結果を生成するために丸めを実行する必要がある場合は、指定した丸めモードが適用されます。

2 番目の状況の Javadoc:

コンテキスト設定に従って丸められ、値が (this / divisor) である BigDecimal を返します。

MathContext の javadoc を参照すると、次のようになります。

BigDecimal クラスによって実装されるものなど、数値演算子の特定のルールを記述するコンテキスト設定をカプセル化する不変オブジェクト。基数に依存しない設定は次のとおりです。 精度: 演算に使用される桁数。結果はこの精度に丸められます roundingMode: 丸めに使用されるアルゴリズムを指定する RoundingMode オブジェクト。

したがって、最初のケースでは、2 の SCALE を指定しました。これは、小数点以下 2 桁の精度に丸めることを意味し、丸めはフロア関数として実行されます。2 番目の計算では、2 の指定された PRECISION があり、2 桁の精度に丸められます。丸めはフロア関数です。したがって、最初のケースでは小数点以下2 桁を要求し、2 番目のケースでは 2 桁だけを要求しました。たとえば、MathContext で 4 桁を要求した場合、答えとして 66.66 が返されます。

したがって、2 つのメソッドが同じ計算を実行しないほど、これはバグではないと思います。

于 2010-03-27T14:40:40.603 に答える
2

これは完全に予想される動作です。間違いを犯して、丸め(スケール)と精度を混ぜていると思います。

total.divide(BigDecimal.valueOf(3), 2, RoundingMode.FLOOR)

ここでは、MathContext をオーバーライドし、丸めを使用します。

total.divide(BigDecimal.valueOf(3), new MathContext(2,    RoundingMode.FLOOR))

ここでは、精度を 2 に設定し、2 桁のみを受け取ります。

于 2010-03-27T14:43:33.450 に答える
0

divide(BigDecimal、MathContext)メソッドのJavadocを読むと、コンテキストの丸めモードのみが考慮されているようです。

于 2010-03-27T14:16:25.030 に答える