Pythonのfloat型を初心者向けにやさしく解説
小数を扱うときに使うのが「float型」。便利だけど、いくつかのクセを知っておくと混乱しません。例題を交えながら、つまずきやすいポイントまで丁寧に説明します。
float型とは何か
- 役割: 小数を表す数値型。例:
1.5,0.1,-3.14,100.0 - 自動判定: 数字に小数点がついていれば、Pythonは自動的にfloatとして扱う
- 型の確認:
type(値)で型がわかる
print(type(1)) # <class 'int'>
print(type(1.0)) # <class 'float'>
print(type(0.5)) # <class 'float'>
Python基本の計算ルール
- 同じ型の計算:
int + int = int、float + float = float - 混在するとfloat:
intとfloatを混ぜると結果はfloat - 割り算は常にfloat:
/で割ると、たとえ割り切れてもfloat
# 足し算・引き算・掛け算
print(1.2 + 1.3) # 2.5
print(5 - 2.0) # 3.0
print(2 * 0.5) # 1.0
# 割り算
print(3 / 2) # 1.5
print(3 / 3) # 1.0
# 整数とfloatの混在
print(10 + 20.0) # 30.0
Pythonよくある落とし穴:誤差が出る理由と対処
なぜ誤差が出るの?
- ポイント: コンピュータは10進数をそのまま保存していません。2進数で近似して保存します。
- 結果: 「0.1」など一部の小数はぴったり表せず、わずかなズレが出ます。
print(0.1 + 0.2) # 0.30000000000000004
Python比較でハマるパターン
- 危険な比較:
==で小数同士を直接比べると、誤差で意図せずFalseになることがあります
x = 0.1 + 0.2
print(x == 0.3) # False(誤差のため)
Python安全な比較の考え方
- 方法1: 許容範囲で比べる(誤差を許す)
x = 0.1 + 0.2
epsilon = 1e-9 # 許容する誤差の幅(用途に応じて調整)
print(abs(x - 0.3) < epsilon) # True
Python- 方法2: Decimalを使って10進数で正確に計算
from decimal import Decimal, getcontext
getcontext().prec = 28 # 精度(桁数)を設定
a = Decimal('0.1')
b = Decimal('0.2')
c = a + b
print(c) # 0.3
print(c == Decimal('0.3')) # True
Python- 注意:
Decimal(0.1)のようにfloatから変換すると、誤差ごと取り込んでしまいます。文字列で渡すのがコツ。
表示と丸めのコツ
- roundで丸める: 指定した小数点以下の桁数に丸める
print(round(1.2345, 2)) # 1.23
print(round(2.675, 2)) # 2.67(2.68に見えそうですが、内部誤差の影響)
Python- フォーマットで見た目を整える: 計算値はそのまま、表示だけ揃える
x = 1/3
print(f"{x:.2f}") # 0.33(表示は丸め、値は保持)
Python- 見た目と値の違い: 画面に「0.33」と出ていても、値は「0.333333…」のまま。表示と内部値は別物。
実務での使い分け
- floatを使う場面: 物理計算、グラフ描画、誤差が問題にならない測定値など
- Decimalを使う場面: お金、数量管理、請求書、テストで厳密一致が必要なとき
# 金額計算はDecimalが安心
from decimal import Decimal
price = Decimal('19.99')
qty = Decimal('3')
total = price * qty
print(total) # 59.97(誤差なし)
Python例題で理解を深める
例題1:税込価格の計算(float)
- 課題: 単価100円、税率8%の税込価格を求め、3つ買った合計を出す
price = 100.0
tax_rate = 0.08
tax_included = price * (1 + tax_rate) # 108.0
total = tax_included * 3 # 324.0
print(tax_included, total)
Python- ポイント: 割り算・掛け算を含む一般的な計算はfloatでOK。ただし金額の厳密さが必要ならDecimalへ。
例題2:直接比較で失敗するケース
- 課題:
0.1を10回足して1.0になるかチェック
x = 0.0
for _ in range(10):
x += 0.1
print(x) # 0.9999999999999999
print(x == 1.0) # False
Python- 解決: 許容誤差で比較
epsilon = 1e-9
print(abs(x - 1.0) < epsilon) # True
Python例題3:売上集計(Decimal推奨)
- 課題: 単価
19.99円の商品を3個、単価5.50円の商品を2個。合計金額を正確に出す
from decimal import Decimal
items = [
(Decimal('19.99'), Decimal('3')),
(Decimal('5.50'), Decimal('2')),
]
total = sum(price * qty for price, qty in items)
print(total) # 56.48(正確)
Python実践で役立つベストプラクティス
- 小数を扱うと結果はfloat: 整数と混ぜても結果はfloatになると覚えておく
- 比較には注意:
==での直接比較は避け、許容誤差またはDecimalを使う - 金額はDecimal: お金や厳密さが求められる値は最初から文字列でDecimalに
- 表示の丸めと値は別: 表示を丸めたいときはフォーマット、値を丸めたいときは
round - 誤差は仕様: バグではなく仕組み。想定して設計する
ちょっとした練習問題
- 平均点の計算: 点数
[80, 90, 75]の平均を計算して、小数第2位まで表示する
ヒント:合計を長さで割る、フォーマット指定で表示調整 - 安全な比較:
0.3と0.1 + 0.2を、許容誤差1e-10で比較してみる - 金額の合計(Decimal): 文字列から
Decimalで"120.50" + "79.50"を計算して表示する
解答と解説
1. 平均点の計算
問題: 点数 [80, 90, 75] の平均を計算して、小数第2位まで表示する
scores = [80, 90, 75]
average = sum(scores) / len(scores) # 合計 ÷ 個数
print(average) # 81.66666666666667
print(f"{average:.2f}") # 81.67
Python解説:
sum(scores)で合計 →245len(scores)で要素数 →3245 / 3 = 81.666...となりfloat型になるf"{average:.2f}"で小数第2位まで表示(四捨五入されて81.67)
2. 安全な比較
問題: 0.3 と 0.1 + 0.2 を、許容誤差 1e-10 で比較する
x = 0.1 + 0.2
epsilon = 1e-10
print(x) # 0.30000000000000004
print(abs(x - 0.3) < epsilon) # True
Python解説:
0.1 + 0.2は内部表現の誤差で0.30000000000000004になる- 直接
x == 0.3だとFalseになる abs(x - 0.3) < 1e-10として「誤差がごく小さいなら同じとみなす」方法を使うとTrueになる
3. 金額の合計(Decimal)
問題: 文字列から Decimal で "120.50" + "79.50" を計算して表示する
from decimal import Decimal
a = Decimal("120.50")
b = Decimal("79.50")
total = a + b
print(total) # 200.00
Python解説:
- 金額のように「正確さ」が必要な場合は
Decimalを使う Decimal("120.50")のように文字列で渡すと誤差が出ない- 結果は
200.00と正確に計算される
まとめ
- 平均値の計算 → 割り算でfloatになるので表示を整える
- 小数比較 → 直接比較は危険、誤差を許容する方法を使う
- 金額計算 →
Decimalを使うと誤差なしで正確
これでfloatの基本と注意点がしっかり理解できるはずです。
次のステップとして「整数型(int)とfloat型の違いを意識したプログラム」を作ってみると理解がさらに深まります。

