Python, fractionsで分数(有理数)の計算
Pythonの標準ライブラリfractionsモジュールを使うと、分数(有理数)での計算ができる。
目次
最大公約数や最小公倍数を算出する方法は以下の記事を参照。
- 関連記事: Pythonで最大公約数と最小公倍数を算出・取得
本記事のサンプルコードでは、以下のようにFraction
クラスをインポートして使う。
from fractions import Fraction
source: fractions_test.py
Fractionオブジェクトを生成: Fraction()
コンストラクタFraction()
でFraction
オブジェクトを生成する方法を説明する。いずれの場合も自動的に約分される。
分子と分母を整数で指定
分子と分母をそれぞれ整数int
で指定する。分母は省略すると1
とみなされる。
print(Fraction(1, 3))
# 1/3
print(Fraction(2, 6))
# 1/3
print(Fraction(3))
# 3
source: fractions_test.py
浮動小数点数(float)を変換
浮動小数点数float
を渡すと、Fraction
に変換される。
print(Fraction(0.25))
# 1/4
print(Fraction(0.3333333333333333))
# 6004799503160661/18014398509481984
print(Fraction(0.3333333333333333).limit_denominator())
# 1/3
source: fractions_test.py
limit_denominator()
メソッドで分母の最大値を制限できる。詳細は後述。
文字列(str)
分数表記の文字列str
を渡すと、Fraction
に変換される。
print(Fraction('2/5'))
# 2/5
print(Fraction('16/48'))
# 1/3
source: fractions_test.py
分子・分母の値を整数で取得
Fraction
のnumerator
, denominator
属性で、それぞれ分子と分母の値を整数int
で取得できる。変更はできない。
a = Fraction(1, 3)
print(a)
# 1/3
print(a.numerator)
print(type(a.numerator))
# 1
# <class 'int'>
print(a.denominator)
print(type(a.denominator))
# 3
# <class 'int'>
# a.numerator = 7
# AttributeError: property 'numerator' of 'Fraction' object has no setter
source: fractions_test.py
分数同士の計算・比較
算術演算子で分数Fraction
同士の計算ができる。
print(Fraction(1, 2) + Fraction(1, 3))
# 5/6
print(Fraction(1, 2) / Fraction(1, 3))
# 3/2
print(Fraction(1, 6) ** 2 + Fraction(1, 2) * Fraction(1, 3))
# 7/36
source: fractions_test.py
比較演算子による比較も可能。
print(Fraction(7, 13) > Fraction(8, 15))
# True
source: fractions_test.py
分数から浮動小数点数(float)への変換
分数Fraction
を浮動小数点数float
に変換するにはfloat()
を使う。
print(float(Fraction(1, 5)))
# 0.2
source: fractions_test.py
Fraction
とfloat
との演算結果は自動的にfloat
に変換される。
print(Fraction(1, 5) * 0.5)
# 0.1
source: fractions_test.py
分数から文字列(str)への変換
分数Fraction
を文字列str
に変換するにはstr()
を使う。
print(str(Fraction(1, 3)))
# 1/3
print(type(str(Fraction(1, 3))))
# <class 'str'>
source: fractions_test.py
有理数近似を取得
limit_denominator()
メソッドで有理数近似を取得できる。
分母が引数max_denominator
以下になる有理数(分数)を返す。省略した場合はmax_denominator=1000000
となる。
以下、具体例を示す。
円周率piやネイピア数eなどの無理数を分数に近似
pi = Fraction(3.14159265359)
print(pi)
# 3537118876014453/1125899906842624
print(pi.limit_denominator(10))
print(pi.limit_denominator(100))
print(pi.limit_denominator(1000))
# 22/7
# 311/99
# 355/113
e = Fraction(2.71828182846)
print(e)
# 6121026514870223/2251799813685248
print(e.limit_denominator(10))
print(e.limit_denominator(100))
print(e.limit_denominator(1000))
# 19/7
# 193/71
# 1457/536
source: fractions_test.py
循環小数を分数に変換
a = Fraction(0.3333333333333333)
print(a)
# 6004799503160661/18014398509481984
print(a.limit_denominator())
# 1/3
a = Fraction(0.14285714285714285)
print(a)
# 2573485501354569/18014398509481984
print(a.limit_denominator())
# 1/7
source: fractions_test.py