【Python】誤差なし!Fractionクラスで分数を正確に計算する
コンピュータが得意な小数計算には、実はわずかな「誤差」がつきものです。しかし、Pythonの fractions.Fraction クラスを使えば、分数を分数のまま、正確に計算することができます。
1. 考え方:Fraction(分数)クラスのメリット
通常の 1 / 3 などの計算は小数(0.333...)として扱われますが、Fractionを使うと「分子」と「分母」のペアとして保持されます。また、計算結果が自動的に約分(最小の分母に整理)されるのが大きな特徴です。
f1 = Fraction(1, 6) → 1/6
f2 = Fraction(3, 6) → 3/6 (1/2)
[ 計算プロセス ]
・1/6 + 3/6 = 4/6
・4/6 を約分 → 2/3
f2 = Fraction(3, 6) → 3/6 (1/2)
[ 計算プロセス ]
・1/6 + 3/6 = 4/6
・4/6 を約分 → 2/3
2. Pythonサンプルプログラム
fractions モジュールから Fraction をインポートします。カンマ区切りで「分子, 分母」の順に指定します。
# -*- coding: utf-8 -*- from fractions import Fraction def main(): # 分数の定義(分子, 分母) f1 = Fraction(1, 6) f2 = Fraction(3, 6) # 加算の実行 result = f1 + f2 print("分数の計算を開始します。") print(f"{f1} + {f2} = {result}") if __name__ == "__main__": main()
3. 実行結果
分数の計算を開始します。
1/6 + 1/2 = 2/3
1/6 + 1/2 = 2/3
4. ステップアップ:多彩な初期化方法
Fractionクラスは、整数のペア以外からも分数を作ることができます。
- 文字列から生成:
Fraction("0.75")と書けば3/4に変換されます。 - 小数から生成:
Fraction(0.5)と書けば1/2になります。 - 属性の取得:
result.numeratorで分子、result.denominatorで分母だけを取り出せます。
5. 浮動小数点数(float)との違い
なぜ普通の割り算ではなく、わざわざFractionを使うのか比較してみましょう。
| 比較項目 | float (通常の小数) | Fraction (分数) |
|---|---|---|
| 正確さ | 循環小数などで誤差が出る | 常に正確(厳密) |
| 表示形式 | 0.3333333333333333 | 1/3 |
| 用途 | 一般的な計算、速度重視 | 金融計算、数学の証明、精密な比率 |
6. まとめ
Pythonの Fraction は、数学的な厳密さを保ちたいプログラムで非常に重宝します。自動で約分までこなしてくれるため、複雑な分数の計算もケアレスミスなく実装できます。誤差が許されないシーンでは、floatの代わりにぜひ活用してみてください!
PR