2017-05-15 10 views
0

値が4桁の数字にうまく収まる必要があるにもかかわらず、BigDecimal除算の原因の丸めが発生するのはなぜですか?BigDecimalの除算は、有効桁数に収まるようになると、原因の丸めが発生するのはなぜですか?

BigDecimal realPercent = new BigDecimal(1.25, new MathContext(4)); 
// 1.25 
BigDecimal percentDivider = new BigDecimal(100, new MathContext(4)); 
realPercent = realPercent.divide(percentDivider, BigDecimal.ROUND_HALF_UP); 
// 0.01 

それは私がメソッド呼び出しに精度を設定することにより、希望のように除算を動作させることも可能だが、それはすでにそれをしない理由、それは説明しません。

realPercent = realPercent.divide(percentDivider, BigDecimal.ROUND_HALF_UP); 

あなたが使用MathContextをオーバーライドします。ここで明示的にあなたの除算呼び出しで丸めモードを設定することにより

realPercent.divide(percentDivider, 4, BigDecimal.ROUND_HALF_UP) 
// 0.0125 
+0

これはどの言語であるかを示したい場合があります。 BigDecimal型を持つ複数の言語があります。 – MSalters

+0

@MSalters aight –

答えて

2

値が(this/divisor)あるBigDecimalを返し、そしてその規模this.scale()

です

最後の部分は重要です。初期値のスケールは2です(スケーリングされていない値は125です)。スケールを固定するオーバーロードを呼び出したため、使用可能な最も近い結果は、スケール= 2、スケールなし= 1、つまり0.01です。

+0

Ah。私は 'MathContext'がスケールを設定するという印象を受けました(本当ではありません!)。最初のBigDecimalを作成してからrealPercent.divide(percentDivider、BigDecimal.ROUND_HALF_UP)を実行した後、私が 'realPercent.setScale(4)'を実行すれば、私は予想していたスケールで分割します。クール。 –

1

。あなたはすぐに丸めモードでMathContextを指定した場合、予想通り、それは動作します:divide(BigDecimal, RoundingMode)Javadocから

BigDecimal realPercent = new BigDecimal(1.25, new MathContext(4, RoundingMode.HALF_UP)); 
// 1.25 
BigDecimal percentDivider = new BigDecimal(100, new MathContext(4, RoundingMode.HALF_UP)); 
realPercent = realPercent.divide(percentDivider); 
//0.0125 
関連する問題