Python(というより多くのプログラミング言語)では、浮動小数点数(float
)を正確に扱うのが難しいことがあります。
これはPythonだけの問題ではなく、コンピュータの仕組みそのものに由来する制限です。
以下では、なぜそのような誤差が起きるのか、どのような状況で起きやすいのか、そしてどう対処すればよいかについて、できるだけ分かりやすく丁寧に説明します。
なぜ浮動小数点数に誤差が出るのか?
コンピュータは 2進数(バイナリ) でデータを表現します。
そのため、10進数で正確に表せる数でも、2進数では表せないことがあるのです。
具体例:0.1は実は正確に表現できない
Pythonの対話環境で次のように入力してみてください。
print(0.1 + 0.2)
出力はこうなります:
0.30000000000000004
「えっ、0.1 + 0.2
は 0.3
じゃないの!?」と思いますよね。
ですが、実際にはこのような小さな誤差が生じます。
コンピュータの中での float の仕組み
Pythonの float
型は、内部的に IEEE 754 という標準の倍精度浮動小数点数(64ビット) で数値を表現しています。
この方式では、数値は以下の3つのパートに分かれます。
- 符号部(1ビット):正か負か
- 指数部(11ビット):小数点の位置
- 仮数部(52ビット):数の本体部分
この仮数部が52ビットしかないため、無限に続くような小数(例:0.1)を近似値で丸めて保存しています。
だから、完全に正確ではないんです。
誤差が目立ちやすいパターン
繰り返し加算
total = 0.0
for i in range(10):
total += 0.1
print(total)
期待は 1.0
ですが、実際は
0.9999999999999999
比較演算
print(0.1 + 0.2 == 0.3) # False!
正確に等しくなることを期待しても、誤差により比較に失敗します。
誤差への対処法
round()
関数を使って丸める
print(round(0.1 + 0.2, 1)) # → 0.3
※注意:四捨五入の特性を理解した上で使うべきです。
誤差の範囲を考慮して比較する
「ほぼ等しいならOK」という判断にしましょう。
Pythonには標準ライブラリでそれを支援する関数があります。
import math
print(math.isclose(0.1 + 0.2, 0.3)) # → True
この math.isclose()
は「誤差の範囲」を自動で考慮して比較してくれる非常に便利な関数です。
decimalモジュールの使用
もっと精度が必要なら、float
ではなく decimal.Decimal
を使うことで 10進数ベースの正確な計算ができます。
from decimal import Decimal
a = Decimal('0.1')
b = Decimal('0.2')
print(a + b) # → 0.3
Decimal
を使うと、2進数による近似誤差が発生しません。
ポイントまとめ
ポイント | 説明 |
---|---|
なぜ誤差が出る? | コンピュータが2進数で数値を表現しているため。特に 0.1 や 0.2 は2進数で正確に表せない。 |
どんなとき誤差が出る? | 小数の加算・減算・比較をしたとき。 |
どう対処する? | round() で丸める、math.isclose() で比較する、decimal モジュールを使う。 |
補足:floatの限界と役割
浮動小数点数(float
)は高速かつ柔軟な表現手段であり、工学計算やゲーム開発などで非常に役立ちます。
しかし、お金や数量など「絶対に誤差が許されない」用途には不向きです。
たとえば、会計ソフトでは float
を使ってはいけません。
代わりに decimal.Decimal
や int
(例えば「円」単位)で扱います。
おすすめの実験
ぜひPythonで以下のコードを試してみてください。浮動小数点数の面白さと注意点が体感できます。
print(0.1 + 0.1 + 0.1 == 0.3) # Falseになることがある
print(round(0.1 + 0.1 + 0.1, 10)) # 丸めてみるとOK
print(math.isclose(0.1 + 0.1 + 0.1, 0.3)) # 安心のTrue
さいごに

Pythonでfloat
型を扱うときは、「誤差はつきもの」だという前提で設計・検証することがとても重要です。
「なぜこの数値になってしまうのか?」「比較するときは大丈夫か?」といった視点を常に持つことで、予想外のバグを未然に防ぐことができます。
以上、Pythonの浮動小数点数floatの誤差についてでした。
最後までお読みいただき、ありがとうございました。