BigDecimal setScaleおよびround


140

この2つの呼び出しの違いは何ですか?(何かありますか?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);

6
以下の承認された回答とは別に、setScale()はBigDecimalの新しいオブジェクトを作成します-不変のクラスを指定
15年

9
@prashこのroundメソッドはBigDecimalの新しいインスタンスも返します。これは、あなたが言ったように、インスタンスは不変だからです。
daiscog 2016年

回答:


212

ほのめかされているが直接扱われていない重要なポイントの1つは、「精度」「スケール」の違いと、2つのステートメントでの使用方法です。 「精度」は、数値の有効数字の総数です。 「スケール」は、小数点の右側の桁数です。

MathContextコンストラクターは、引数として精度とRoundingModeのみを受け入れるため、最初のステートメントでスケールが指定されることはありません。

setScale() 引数としてscaleとRoundingModeを受け入れますが、2番目のステートメントで精度を指定することはありません。

小数点を1つ右に移動すると、違いが明確になります。

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456

38
Re: ""精度 "は、数値の合計桁数です。" いいえ。精度は有効桁数です。0.000042Mの精度は2である
デビッドJ.

2
参照:「精度」:桁数は、正確な結果の左端のゼロ以外の桁から始まります。docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy

「精度は有効桁数」である場合、なぜ0.0000009の精度が2になるのですか?それは1でなければなりません
Sanchi Girotra

1
BigDecimalの価値はどのように設定されていますか?どのように値を出力していますか(String.format()を使用すると、有効数字が隠される可能性があります)?
デイルピーターズ2016年

1
@SanchiGirotra精度は「スケーリングされていない値の桁数」です。スケールなしの値が90でスケールが8 の精度が2の場合、0.0000009になります。1の精度、9のスケールなしの値と7のスケールないよう
daiscog

52

確かに大きな違いがありますので、覚えておいてください。setScaleは実際に数値のスケールを設定しますが、roundは数値を指定された桁に丸めますが、jdk内で言及されているように、「正確な結果の左端の桁から始まります」。したがって、サンプルについては結果は同じですが、代わりに0.0034を試してください。これが私のブログでの私のメモです:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.