Python | 整数と実数(float型)

Python
スポンサーリンク

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 = intfloat + float = float
  • 混在するとfloat: intfloatを混ぜると結果は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
  • 誤差は仕様: バグではなく仕組み。想定して設計する

ちょっとした練習問題

  1. 平均点の計算: 点数[80, 90, 75]の平均を計算して、小数第2位まで表示する
    ヒント:合計を長さで割る、フォーマット指定で表示調整
  2. 安全な比較: 0.30.1 + 0.2を、許容誤差1e-10で比較してみる
  3. 金額の合計(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) で合計 → 245
  • len(scores) で要素数 → 3
  • 245 / 3 = 81.666... となりfloat型になる
  • f"{average:.2f}" で小数第2位まで表示(四捨五入されて81.67)

2. 安全な比較

問題: 0.30.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型の違いを意識したプログラム」を作ってみると理解がさらに深まります。

Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました