0.1 + 0.2 が 0.3 にならない理由
浮動小数点数は2進数で正確に表現できない値があり、計算結果にわずかな誤差が生じます。==での比較はほぼ確実に失敗します。
なぜエラーが出ないのか
出力: False
(エラーなし)- Pythonは何も報告しません。文法として正しいためです
出力: False- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 print(0.1 + 0.2 == 0.3 ) ^
出力: False期待: True (エラーにはなりません)
0.1や0.2は2進数では正確に表現できず、わずかな誤差を含みます。浮動小数点数の比較は==ではなく、差が十分小さいかどうかで判定します。
直し方: 0.1 + 0.2 == 0.3 を abs(0.1 + 0.2 - 0.3) < 1e-9 にします。
広告
広告スロット(未設定)
パターン2
1 total = 0.1 + 0.1 + 0.1 2 print(total == 0.3 ) ^
出力: False期待: True (エラーにはなりません)
累積計算では誤差がさらに積み重なります。金額計算などで==比較をすると、理論上正しいはずの値が一致しないことがあります。
直し方: total == 0.3 を abs(total - 0.3) < 1e-9 にします。
パターン3
1 x = 1.1 - 1.0 2 print(x == 0.1 ) ^
出力: False期待: True (エラーにはなりません)
引き算でも同じ誤差が発生します。金額や単位換算などfloatを使う場面では、常に許容誤差を使った比較を検討します。
直し方: x == 0.1 を abs(x - 0.1) < 1e-9 にします。
よくある誤解
floatをより精度の高い型に変えても解決しません。2進小数で表現できないという根本的な制約は変わらないため、比較は常に許容誤差(イプシロン)を使って行います。
まとめ
0.1 + 0.2 が 0.3 にならない理由は上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。