Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで有理数(分数)を扱う方法|fractionsモジュールの使い方を徹底解説

有理数(rational number)とは、p/q という商(分数)の形で表すことができる数のことです。Pythonの標準ライブラリに含まれる fractions モジュールを使えば、有理数の演算を正確に行えます。

Fractionクラスとは

fractionsモジュールには Fraction クラスが定義されています。このクラスのオブジェクトは、以下のようにさまざまな方法で生成できます。

Fraction(num, denom)

分子と分母を指定して生成する

基本となるコンストラクタは、分子(numerator)と分母(denominator)の2つの引数を受け取ります。分子のデフォルト値は0、分母のデフォルト値は1です。分母に0を指定すると ZeroDivisionError が発生するので注意してください。

>>> from fractions import Fraction
>>> n1 = Fraction(2,5)
>>> n1
Fraction(2, 5)
>>> n2 = Fraction(6,15)
>>> n2
Fraction(2, 5)
>>> n3 = Fraction(10,1)
>>> n3
Fraction(10, 1)
>>> n3 = Fraction(10)
>>> n3
Fraction(10, 1)

上記の例からわかるように、分子と分母は共通因数で自動的に約分され、常に最小の形に簡略化されます。Fraction(6,15)Fraction(2, 5) になっている点に注目しましょう。

文字列から生成する

Fractionコンストラクタは、有効な数値表現を含む文字列も引数として受け取れます。整数、分数形式、小数、指数表記などが利用可能です。

>>> n1 = Fraction('5')
>>> n1
Fraction(5, 1)
>>> n2 = Fraction('4/7')
>>> n2
Fraction(4, 7)
>>> n3 = Fraction('0.25')
>>> n3
Fraction(1, 4)
>>> n4 = Fraction('1.23E4')
>>> n4
Fraction(12300, 1)

float型とDecimal型の扱いの違い

浮動小数点数(float)もコンストラクタの引数にできます。ただし、floatは内部的に2進数で表現されるため、誤差を含む場合があります。その結果、生成されるFractionオブジェクトの分子・分母が巨大な数になることがあります。

一方、Decimal クラスのオブジェクトを渡せば、10進数として正確な値に基づいたFractionオブジェクトが得られます。

>>> from fractions import Fraction
>>> from decimal import Decimal
>>> n1 = Fraction(2.1)
>>> n1
Fraction(4728779608739021, 2251799813685248)
>>> n2 = Fraction(Decimal('2.1'))
>>> n2
Fraction(21, 10)

同じ「2.1」でも、float経由では不正確な分数になり、Decimal経由では Fraction(21, 10) という期待どおりの結果が得られることが確認できます。厳密な計算が必要な場合はDecimalとの組み合わせを推奨します。

Fractionオブジェクトの四則演算

Fractionオブジェクト同士は、加減乗除をはじめとするすべての算術演算が可能です。結果も常にFractionオブジェクトとして返されます。

>>> n1 = Fraction(2,3)
>>> n2 = Fraction(1,2)
>>> n1+n2
Fraction(7, 6)
>>> n1-n2
Fraction(1, 6)
>>> n1*n2
Fraction(1, 3)
>>> n1/n2
Fraction(4, 3)

参考までに、分数形式での四則演算の基本的な計算方法をおさらいしておきましょう。

 Pythonで有理数(分数)を扱う方法|fractionsモジュールの使い方を徹底解説

分子・分母へのアクセス

Fractionオブジェクトには numerator(分子)と denominator(分母)という2つの属性があり、それぞれ個別に参照できます。

>>> n1 = Fraction(2,3)
>>> n1.numerator
2
>>> n1.denominator
3

floor・ceilメソッド

Fractionクラスには、商より小さい最大の整数(床値:floor)と、商より大きい最小の整数(天井値:ceil)を求めるための便利なメソッドが用意されています。

>>> n1 = Fraction(355,113)
>>> n1.__floor__()
3
>>> n1.__ceil__()
4

355/113 は円周率の近似値(約3.14159…)なので、floorで3、ceilで4が返されます。

limit_denominator()で近似分数を求める

もうひとつのクラスメソッド limit_denominator() を使うと、「指定した値以下の分母を持つ中で最も元の値に近い分数」を取得できます。浮動小数点数の誤差を含む値を、きれいな分数に変換したい場合に特に役立ちます。

>>> Fraction('2.71828').limit_denominator(400)
Fraction(1071, 394)

まとめ

本記事では、Python標準ライブラリのfractionsモジュールについて、Fractionオブジェクトの生成方法(数値・文字列・float・Decimal)、四則演算、numerator/denominator属性、floor・ceil、limit_denominator()などの主要な機能と使い方を解説しました。金額計算や厳密な数学的処理が必要な場面で、floatの代わりにFractionを活用することで、丸め誤差のない正確な計算が実現できます。

  1. Pythonのreduce関数で有理数の積を求める方法を解説

    有理数(分数)のリストが与えられたとき、reduce関数を使ってそれらの積を求める方法を解説します。reduce()関数は、2つの引数を受け取る関数をリストの各要素に対して左から右へ累積的に適用していく高階関数です。例えば、入力が fractions = [(5,3),(2,8),(6,9),(5,12),(7,2)] の場合、出力は (175, 432) になります。これは次の計算によるものです。5/3 × 2/8 × 6/9 × 5/12 × 7/2 = (5×2×6×5×7)/(3×8×9×12×2) = 2100/5184 = 175/432解決の手順空の新しいリスト fracs を用

  2. Excelで数値を分数として表示する方法|書式設定の手順を徹底解説

    Excelシートに分数を入力しようとしたのに、Enterキーを押した瞬間に小数や整数に変換されてしまい、戸惑ったことはありませんか?実はMicrosoft Excelには「分数」という表示形式が用意されており、これを使えば数値をそのまま分数の形で表示できます。 Excelの「分数」表示形式とは? 数学において分数とは「整数ではない数値」を指しますが、Excelでは分数は「数値を分数の形で表示するための表示形式」のことを意味します。この書式設定には、分子を1桁・2桁・3桁で表示するオプションや、「2分の1」「4分の1」「8分の1」「16分の1」など、分母を固定して表示するオプションなど、さまざま