0

販売レートが 184.84 になっているのはなぜですか? BigDecimal.ROUND_UP でこのように動作するのはなぜですか。BigDecimal.ROUND_HALF_EVEN で確認しました。それは正常に動作します。しかし、なぜこのような行動をとっているのか知りたいです。

for(int i = 0; i < 50; i++){
    double  sellrate    = 184.83;
    BigDecimal sellRate = new BigDecimal(sellrate);
    sellRate    = sellRate.setScale(2,BigDecimal.ROUND_UP);
    System.out.println("sellRate : "+sellRate); 
}
4

2 に答える 2

5

これが理由です:

double sellrate = 184.83;
BigDecimal sellRate = new BigDecimal(sellrate);
System.out.println("sellRate: " + sellRate);

版画

sellRate: 184.830000000000012505552149377763271331787109375

これはBigDecimal JavaDocで説明されています:

このコンストラクターの結果は、予測できない場合があります。Java で new BigDecimal(0.1) を書き込むと、正確に 0.1 に等しい BigDecimal (スケール 1 のスケールなしの値 1) が作成されると思われるかもしれませんが、実際には 0.1000000000000000055511151231257827021181583404541015625 に等しくなります。これは、0.1 を double として正確に表現できないためです (さらに言えば、有限長の 2 進小数としても表現できません)。したがって、コンストラクターに渡される値は、見た目はともかく、0.1 と正確には等しくありません。

Stringコンストラクターを使用する

BigDecimal sellRate = new BigDecimal("184.83");

の正確な値を取得したい場合BigDecimal

于 2013-03-28T14:48:43.597 に答える
1

BigDecimal(double)コンストラクターはあまり信頼できません。API javadoc を確認してください。BigDecimal を構築するための推奨される方法は、BigDecimal(String)コンストラクターを使用することです。

このコンストラクターの結果は、予測できない場合があります。Java で new BigDecimal(0.1) を書き込むと、正確に 0.1 に等しい BigDecimal (スケール 1 のスケールなしの値 1) が作成されると思われるかもしれませんが、実際には 0.1000000000000000055511151231257827021181583404541015625 に等しくなります。これは、0.1 を double として正確に表現できないためです (さらに言えば、有限長の 2 進小数としても表現できません)。したがって、コンストラクターに渡される値は、見た目はともかく、0.1 と正確には等しくありません。

于 2013-03-28T14:49:51.650 に答える