回答編集履歴

1 追記

ozwk

ozwk score 7475

2017/02/14 11:26  投稿

`3000.0 * (1.0 - 0.9) * 0.01 / 2.0`は確かに手計算では1.5ですが、
DoubleやFloatは桁数が有限な2進数であることに注意しましょう。
10進数だと単純な小数も2進数だと循環小数になることが多いです。
例えば
0.01は2進数で`0 . 0000 0010 1000 1111 0101 1100 0010 1000 1111 0101 1100 0010 1000 1111 ...`
0.9は2進数で`0 . 1110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110...`
0.9は2進数で`0 . 1110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110...`
なお、
2^-1 = 0.5
2^-2 = 0.25
2^-3 = 0.125
2^-4 = 0.0625
...
と、一桁ずれて末尾5と言うパターンなので、
10進数表記で5で終わらない小数は2進数だと循環小数になります。
終わっても循環小数になるものもあります。
なので10進表記の小数をFloat等に変換するとだいたい誤差が出ます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る