Pythonで分数演算(fractions.Fraction)
この記事では、Pythonのfractionsモジュールを使って分数演算を行う方法を説明します。fractions.Fractionクラスの使い方、基本的な演算、便利なメソッドなどについて解説します。
目次
fractions.Fractionクラスの概要
Pythonの`fractions`モジュールは、分数を正確に扱うためのクラス`Fraction`を提供しています。`Fraction`クラスを使うことで、浮動小数点数の近似値ではなく、真の分数として計算を行うことができます。
import fractions
# Fractionクラスをインポート
このモジュールを使うと、浮動小数点演算で発生する丸め誤差を回避し、正確な分数計算を行うことができます。
分数オブジェクトの作成
分数オブジェクトは、分子と分母を指定して作成します。
from fractions import Fraction
# 分数オブジェクトの作成
fraction1 = Fraction(3, 4) # 3/4
fraction2 = Fraction(1, 2) # 1/2
fraction3 = Fraction(1, 0) # ゼロ除算エラーが発生する
分子と分母は整数である必要があります。分母が0の場合は`ZeroDivisionError`が発生します。また、文字列から分数オブジェクトを作成することも可能です。
fraction4 = Fraction('3/4') # 文字列から分数オブジェクトを作成
fraction5 = Fraction('-1/2') # 負の分数も作成可能
fraction6 = Fraction('0.75') # 小数から分数オブジェクトを作成
基本的な演算
分数オブジェクトは、標準的な算術演算子をサポートしています。
from fractions import Fraction
fraction1 = Fraction(3, 4)
fraction2 = Fraction(1, 2)
# 加算
addition = fraction1 + fraction2
print(f'加算: {addition}') # 出力: 加算: 5/4
# 減算
subtraction = fraction1 - fraction2
print(f'減算: {subtraction}') # 出力: 減算: 1/4
# 乗算
multiplication = fraction1 * fraction2
print(f'乗算: {multiplication}') # 出力: 乗算: 3/8
# 除算
division = fraction1 / fraction2
print(f'除算: {division}') # 出力: 除算: 3/2
これらの演算の結果は、常に既約分数として表現されます。
便利なメソッド
Fractionクラスは、分数の簡約化や浮動小数点数への変換など、便利なメソッドを提供しています。
from fractions import Fraction
fraction1 = Fraction(6, 8)
# 簡約化
simplified = fraction1.limit_denominator(1000) # 1000以下の分母で簡約化
print(f'簡約化: {simplified}') # 出力: 簡約化: 3/4
# 浮動小数点数への変換
float_value = fraction1
print(f'浮動小数点数: {float_value}') # 出力: 浮動小数点数: 0.75
`limit_denominator()`メソッドは、指定した最大分母以下の既約分数に変換します。これは、近似値が必要な場合に役立ちます。`float()`関数を使って、分数オブジェクトを浮動小数点数に変換できます。
その他の機能
Fractionクラスは、他にも様々な機能を提供しています。例えば、比較演算子、`__str__`メソッドによる文字列表現、`numerator`属性と`denominator`属性による分子と分母の取得などが可能です。
from fractions import Fraction
fraction1 = Fraction(3, 4)
fraction2 = Fraction(1, 2)
# 比較
print(f'fraction1 > fraction2: {fraction1 > fraction2}') # 出力: fraction1 > fraction2: True
# 文字列表現
print(f'fraction1: {fraction1}') # 出力: fraction1: 3/4
# 分子と分母の取得
print(f'fraction1の分子: {fraction1.numerator}') # 出力: fraction1の分子: 3
print(f'fraction1の分母: {fraction1.denominator}') # 出力: fraction1の分母: 4