Pythonで分数を扱う:fractionsモジュールによる正確な有理数計算

コンピュータで小数を扱う際、浮動小数点数(float)を使用すると、1 / 30.3333... となり、厳密な計算ができずに誤差が生じることがあります。

数学的な「分数(有理数)」として正確に値を保持・計算したい場合、Pythonの標準ライブラリである fractions モジュールを使用します。

この記事では、Fraction クラスを使った分数の作成方法と、四則演算の実装例について解説します。

目次

Fraction オブジェクトの作成

fractions モジュールから Fraction クラスをインポートして使用します。

分数は、「分子(numerator)」と「分母(denominator)」を引数に指定して作成します。また、文字列から作成することも可能です。

構文:

from fractions import Fraction

# 方法1: 数値で指定 Fraction(分子, 分母)
f1 = Fraction(1, 3)

# 方法2: 文字列で指定
f2 = Fraction("1/3")

自動的な約分

Fraction は、作成された時点で自動的に約分(簡約)されます。

from fractions import Fraction

# 2/8 は自動的に 1/4 になる
f_reduced = Fraction(2, 8)

print(f"約分結果: {f_reduced}")

実行結果:

約分結果: 1/4

具体的な使用例:レシピの分量計算

例として、料理の材料(カップ単位)を分数で計算するプログラムを作成します。

小麦粉 $\frac{1}{2}$ カップと、砂糖 $\frac{1}{3}$ カップを扱います。

from fractions import Fraction

# 材料の定義
flour_cup = Fraction(1, 2)  # 小麦粉 1/2
sugar_cup = Fraction(1, 3)  # 砂糖 1/3

print(f"小麦粉: {flour_cup} カップ")
print(f"砂糖: {sugar_cup} カップ")
print("-" * 20)

# 1. 足し算(合計量)
# 通分して計算される (1/2 + 1/3 = 3/6 + 2/6 = 5/6)
total_amount = flour_cup + sugar_cup
print(f"合計: {total_amount} カップ")

# 2. 引き算(差分)
# (1/2 - 1/3 = 3/6 - 2/6 = 1/6)
diff_amount = flour_cup - sugar_cup
print(f"差分: {diff_amount} カップ")

# 3.掛け算(分量の倍増)
# 小麦粉を4倍量にする (1/2 * 4 = 2)
bulk_flour = flour_cup * 4
print(f"小麦粉4倍量: {bulk_flour} カップ")

# 4. 割り算(分配)
# 砂糖を2等分する (1/3 / 2 = 1/6)
split_sugar = sugar_cup / 2
print(f"砂糖2等分: {split_sugar} カップ")

実行結果:

小麦粉: 1/2 カップ
砂糖: 1/3 カップ
--------------------
合計: 5/6 カップ
差分: 1/6 カップ
小麦粉4倍量: 2 カップ
砂糖2等分: 1/6 カップ

このように、通分や約分といった面倒な計算を意識することなく、正確な分数計算が行えます。

分子・分母の取得と型変換

作成した分数オブジェクトから、分子や分母を取り出したり、小数(float)に変換したりすることも可能です。

ratio = Fraction(3, 7)

# 分子の取得 (.numerator)
print(f"分子: {ratio.numerator}")

# 分母の取得 (.denominator)
print(f"分母: {ratio.denominator}")

# 浮動小数点数への変換
print(f"小数値: {float(ratio)}")

実行結果:

分子: 3
分母: 7
小数値: 0.42857142857142855

まとめ

  • 正確な数値計算を行うには fractions モジュールの Fraction クラスを使用します。
  • Fraction(分子, 分母) で作成し、自動的に約分されます。
  • 四則演算(+, -, *, /)をサポートしており、結果も Fraction 型になります(計算相手が float の場合を除く)。
  • 確率計算や、比率を維持したい計算などに適しています。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次