Python, fractionsで分数(有理数)の計算
Pythonの標準ライブラリfractionsモジュールを使うと、分数(有理数)での計算ができる。
ここでは、
- Fractionのコンストラクタ
- 分子、分母の値を整数で取得
- 分数(有理数)の計算・比較
- 分数から小数(float)への変換
- 分数から文字列(str)への変換
- 有理数近似を取得
について説明する。
最大公約数や最小公倍数を算出する方法は以下の記事を参照。
- 関連記事: Pythonで最大公約数と最小公倍数を算出・取得
スポンサーリンク
Fractionのコンストラクタ
Fraction
インスタンスを生成する方法はいくつかある。なお、いずれの場合も自動的に約分される。
分子と分母を整数で指定
分子と分母をそれぞれ整数で指定する。分母は省略すると1
とみなされる。
from fractions import Fraction
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.33))
# 5944751508129055/18014398509481984
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
でそれぞれ分子と分母の値を整数で取得できる。変更はできない。
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: can't set attribute
source: fractions_test.py
分数(有理数)の計算・比較
算術演算子で足し算や引き算などの計算できる。
result = Fraction(1, 6) ** 2 + Fraction(1, 3) / Fraction(1, 2)
print(result)
print(type(result))
# 25/36
# <class 'fractions.Fraction'>
source: fractions_test.py
比較演算子も使える。
print(Fraction(7, 13) > Fraction(8, 15))
# True
source: fractions_test.py
分数から小数(float)への変換
float()
でFraction
から小数へ変換できる。
a_f = float(a)
print(a_f)
print(type(a_f))
# 0.3333333333333333
# <class 'float'>
source: fractions_test.py
小数(float
)と計算するとfloat
型に自動的に変換される。
b = a + 0.1
print(b)
print(type(b))
# 0.43333333333333335
# <class 'float'>
source: fractions_test.py
分数から文字列(str)への変換
文字列へ変換するにはstr()
を使う。
a_s = str(a)
print(a_s)
print(type(a_s))
# 1/3
# <class 'str'>
source: fractions_test.py
有理数近似を取得
Fraction
型のメソッド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.565656565656)
print(a)
# 636872674577009/1125899906842624
print(a.limit_denominator())
# 56/99
a = Fraction(0.3333)
print(a)
# 6004199023210345/18014398509481984
print(a.limit_denominator())
print(a.limit_denominator(100))
# 3333/10000
# 1/3
source: fractions_test.py
スポンサーリンク