3

私はJavaアプリケーション内にスクリプトエンジンを実装するオープンソースプロジェクト(axil)を使用していますが、BigDecimalの丸めを利用しようとしているときに大きな障害にぶつかりました。BigDecimalは、入力を科学的記数法に変換してから、渡された精度を、非SN表現ではなく、数値のSN表現の係数に適用しているようです。例えば:

new BigDecimal("-232454.5324").round(new MathContext(2, RoundingMode.HALF_UP)).toString()

の結果を生成し-2.3E+5ます。これは私にとって2つの問題を提示します。-232454.5まず、 (-2.324545E+5)の結果を期待しているので-230000、結果を含むすべての数学を破棄します。そして第二に、私はSNで結果を取得することを期待しておらず、回避する方法も見つけることができません(ただし、まだ遭遇していないフォーマット方法があると思います)。

プロジェクトの性質上、round()メソッドに渡される数値のサイズ/タイプについてはほとんど期待できないため、ソリューションは高度にモジュール化する必要があります。誰か提案はありますか?役立つ場合は、プロジェクトのこのバグに関するGoogleコードの問題レポートへのリンクをご覧ください。 そして、ここにプロジェクトのホームページへのリンクがあります。

どんな助けでも大歓迎です。

4

3 に答える 3

9

roundメソッドを使用せず、代わりにsetScaleを使用します。引数は小数点以下の桁数です。

BigDecimal bd = new BigDecimal("-232454.5324").setScale(1,
                RoundingMode.HALF_UP);
String string = bd.toPlainString();
System.out.println(string); // prints -232454.5

また、setScaleは新しいBigDecimalインスタンスを返しますが、現在のインスタンスのスケールは変更しないことに注意してください。

于 2012-06-04T15:02:08.143 に答える
1

AMathContext精度を取ります。これは、結果の有効桁数(小数点の前後 )の総数です。BigDecimalの論理はここで正しいです。

于 2012-06-04T18:46:01.630 に答える
1

私はそのようにします:

BigDecimal number = new BigDecimal("22.2222").setScale(0, RoundingMode.UP);

if (number.intValue() % 2 != 0) {
    number = number.add(BigDecimal.ONE);
}

System.out.println(number); // => 24
于 2012-06-04T15:46:57.583 に答える