web-dev-qa-db-ja.com

BigDecimal setScaleおよびround

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

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

言及されているが直接対処されていない重要な点の1つは、"precision""scale"の違いと、2つのステートメントでの使用方法です。 "precision"は、数字の有効桁数の合計です。 "scale"は、小数点の右側の桁数です。

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

setScale()は明らかにRoundingModeと同様に引数としてscaleを受け入れますが、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
192
dale peters

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

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

51
user817756