2012-02-13 7 views
1

フォーマット小数パーセントの非常に奇妙な行動

14%

NumberFormat fmt = NumberFormat.getPercentInstance(); 
fmt.setRoundingMode(RoundingMode.HALF_UP); 
fmt.setMinimumFractionDigits(0); 
fmt.setMaximumFractionDigits(0); 
System.out.println(fmt.format(0.145)); 

はしかし、私は非常に奇妙な結果を得ます

値0.145を他の値、たとえば0.125に変更すると正常に動作し、結果は期待どおりになります

13%

誰かがこの上でいくつかの光を当てることができますか?事前のおかげで

答えて

1

これは完璧な精度を期待する場合は、Use BigDecimal

0.1449999999999999900079927783735911361873149871826171875 

に丸めさ0.145その結果、原因doubleに固有の丸め誤差にあります。

+0

好奇心の高まりから、なぜ0.125では同じではないのですか? – kosa

+0

0.125は '1/8'に等しいので、バイナリで分数として正確に表すことができるからです。 –

+0

入手しました。意味をなさないありがとう! – kosa

1

私はそれがフロートのインターン表現の結果だと思います。 (2進数で表される10進数)。

0.145は内部的に0.144999999999 ...と表示されるため、丸めモードが切り捨てられます。