Pythonの浮動小数点数floatの誤差について

Python,イメージ

AI実装検定のご案内

Python(というより多くのプログラミング言語)では、浮動小数点数(float)を正確に扱うのが難しいことがあります。

これはPythonだけの問題ではなく、コンピュータの仕組みそのものに由来する制限です。

以下では、なぜそのような誤差が起きるのか、どのような状況で起きやすいのか、そしてどう対処すればよいかについて、できるだけ分かりやすく丁寧に説明します。

目次

なぜ浮動小数点数に誤差が出るのか?

コンピュータは 2進数(バイナリ) でデータを表現します。

そのため、10進数で正確に表せる数でも、2進数では表せないことがあるのです。

具体例:0.1は実は正確に表現できない

Pythonの対話環境で次のように入力してみてください。

print(0.1 + 0.2)

出力はこうなります:

0.30000000000000004

「えっ、0.1 + 0.20.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.10.2 は2進数で正確に表せない。
どんなとき誤差が出る?小数の加算・減算・比較をしたとき。
どう対処する?round()で丸める、math.isclose()で比較する、decimalモジュールを使う。

補足:floatの限界と役割

浮動小数点数(float)は高速かつ柔軟な表現手段であり、工学計算やゲーム開発などで非常に役立ちます。

しかし、お金や数量など「絶対に誤差が許されない」用途には不向きです。

たとえば、会計ソフトでは float を使ってはいけません。

代わりに decimal.Decimalint(例えば「円」単位)で扱います。

おすすめの実験

ぜひ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,イメージ

Pythonでfloat型を扱うときは、「誤差はつきもの」だという前提で設計・検証することがとても重要です。

「なぜこの数値になってしまうのか?」「比較するときは大丈夫か?」といった視点を常に持つことで、予想外のバグを未然に防ぐことができます。

以上、Pythonの浮動小数点数floatの誤差についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次