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

Modified: | Tags: Python, 算数・数学

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

最大公約数や最小公倍数を算出する方法は以下の記事を参照。

本記事のサンプルコードでは、以下のようにFractionクラスをインポートして使う。

from fractions import Fraction

Fractionオブジェクトを生成: Fraction()

コンストラクタFraction()Fractionオブジェクトを生成する方法を説明する。いずれの場合も自動的に約分される。

分子と分母を整数で指定

分子と分母をそれぞれ整数intで指定する。分母は省略すると1とみなされる。

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.3333333333333333))
# 6004799503160661/18014398509481984

print(Fraction(0.3333333333333333).limit_denominator())
# 1/3

limit_denominator()メソッドで分母の最大値を制限できる。詳細は後述。

文字列(str)

分数表記の文字列strを渡すと、Fractionに変換される。

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

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

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

Fractionnumerator, 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

分数同士の計算・比較

算術演算子で分数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

比較演算子による比較も可能。

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

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

分数Fractionを浮動小数点数floatに変換するにはfloat()を使う。

print(float(Fraction(1, 5)))
# 0.2

Fractionfloatとの演算結果は自動的にfloatに変換される。

print(Fraction(1, 5) * 0.5)
# 0.1

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

分数Fractionを文字列strに変換するにはstr()を使う。

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

print(type(str(Fraction(1, 3))))
# <class 'str'>

有理数近似を取得

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.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

関連カテゴリー

関連記事