Python, fractionsで分数(有理数)の計算

Pythonの標準ライブラリfractionsモジュールを使うと、分数(有理数)での計算ができます。

9.5. fractions — 有理数 — Python 3.6.4 ドキュメント

ここでは、

Fractionのコンストラクタ 分子、分母の値を整数で取得 分数(有理数)の計算・比較 分数から小数(float)への変換 分数から文字列(str)への変換 有理数近似を取得

について説明します。 最大公約数や最小公倍数を算出する方法は

Fractionのコンストラクタ

Fractionインスタンスを生成する方法はいくつかあります。なお、いずれの場合も自動的に約分されます。 分子と分母を整数で指定 分子と分母をそれぞれ整数で指定します。分母は省略すると1とみなされます。

from fractions import Fraction

print(Fraction(1, 3))
# 1/3

print(Fraction(2, 6))
# 1/3

print(Fraction(3))
# 3

小数(float) 小数(float型)の値を渡すと分数(Fraction型)に変換されます。

print(Fraction(0.25))
# 1/4

print(Fraction(0.33))
# 5944751508129055/18014398509481984

分母の最大値を指定して近似したい場合は、後述のlimit_denominator()メソッドを使います。 文字列(str) 文字列(str型)の値を渡すと分数(Fraction型)に変換されます。

print(Fraction('2/5'))
# 2/5

print(Fraction('16/48'))
# 1/3

分子、分母の値を整数で取得

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

分数(有理数)の計算・比較

算術演算子で足し算や引き算などの計算できます。

result = Fraction(1, 6) ** 2 + Fraction(1, 3) / Fraction(1, 2)
print(result)
print(type(result))
# 25/36
# <class 'fractions.Fraction'>

比較演算子も使えます。

print(Fraction(7, 13) > Fraction(8, 15))
# True

分数から小数(float)への変換

float()でFractionから小数へ変換できます。

a_f = float(a)
print(a_f)
print(type(a_f))
# 0.3333333333333333
# <class 'float'>

小数(float)と計算するとfloat型に自動的に変換されます。

b = a + 0.1
print(b)
print(type(b))
# 0.43333333333333335
# <class 'float'>

分数から文字列(str)への変換

文字列へ変換するにはstr()を使います。

a_s = str(a)
print(a_s)
print(type(a_s))
# 1/3
# <class 'str'>

有理数近似を取得

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

循環小数を分数に変換

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
Last Updated: 6/26/2019, 10:34:03 PM