fractions --- 有理数¶
ソースコード: Lib/fractions.py
fractions モジュールは有理数計算のサポートを提供します。
A Fraction instance can be constructed from a pair of rational numbers, from a single number, or from a string.
- class fractions.Fraction(numerator=0, denominator=1)¶
- class fractions.Fraction(other_fraction)
- class fractions.Fraction(float)
- class fractions.Fraction(decimal)
- class fractions.Fraction(string)
The first version requires that numerator and denominator are instances of
numbers.Rationaland returns a newFractioninstance with a value equal tonumerator/denominator. If denominator is zero, it raises aZeroDivisionError. The second version requires that other_fraction is an instance ofnumbers.Rationaland returns aFractioninstance with the same value. The next two versions accept either afloator adecimal.Decimalinstance, and return aFractioninstance with exactly the same value. Note that due to the usual issues with binary floating point (see 浮動小数点演算、その問題と制限), the argument toFraction(1.1)is not exactly equal to 11/10, and soFraction(1.1)does not returnFraction(11, 10)as one might expect. (But see the documentation for thelimit_denominator()method below.) The last version of the constructor expects a string or unicode instance. The usual form for this instance is:[sign] numerator ['/' denominator]
ここで、オプションの
signは '+' か '-' のどちらかであり、numeratorおよび (存在する場合)denominatorは十進数の数字の文字列です (コード中の整数リテラルと同様、アンダースコアを使って桁を区切れます)。さらに、floatコンストラクタで受け付けられる有限の値を表す文字列は、Fractionコンストラクタでも受け付けられます。どちらの形式でも、入力される文字列は前後に空白があって構いません。以下に、いくつかの例を示します:>>> from fractions import Fraction >>> Fraction(16, -10) Fraction(-8, 5) >>> Fraction(123) Fraction(123, 1) >>> Fraction() Fraction(0, 1) >>> Fraction('3/7') Fraction(3, 7) >>> Fraction(' -3/7 ') Fraction(-3, 7) >>> Fraction('1.414213 \t\n') Fraction(1414213, 1000000) >>> Fraction('-.125') Fraction(-1, 8) >>> Fraction('7e-6') Fraction(7, 1000000) >>> Fraction(2.25) Fraction(9, 4) >>> Fraction(1.1) Fraction(2476979795053773, 2251799813685248) >>> from decimal import Decimal >>> Fraction(Decimal('1.1')) Fraction(11, 10)
Fractionクラスは抽象基底クラスnumbers.Rationalを継承し、その全てのメソッドと演算を実装します。Fractionインスタンスは ハッシュ可能 で、不変 (immutable) であるものとして扱われます。加えて、Fractionには以下のプロパティとメソッドがあります:バージョン 3.2 で変更:
Fractionのコンストラクタがfloatおよびdecimal.Decimalインスタンスを受け付けるようになりました。バージョン 3.9 で変更: numerator と denominator の正規化に
math.gcd()関数を使うようになりました。math.gcd()は常にint型を返します。 以前は最大公約数の型が numerator と denominator に依存していました。バージョン 3.11 で変更:
Fractionは、typing.SupportsIntのインスタンス検査を満たすよう__int__を実装しました。バージョン 3.12 で変更: 文字列の入力で、
Fraction('2 / 3')のようにスラッシュの前後に空白を入れられるようになりました。バージョン 3.12 で変更:
Fractioninstances now support float-style formatting, with presentation types"e","E","f","F","g","G"and"%"".バージョン 3.13 で変更: 表現型を指定せずに
Fractionインスタンスを書式化する場合に、埋め文字、配置、符号の処理、最小幅、桁のグループ化をサポートするようになりました。- numerator¶
有理数を既約分数で表したときの分子。
- denominator¶
Denominator of the Fraction in lowest terms. Guaranteed to be positive.
- as_integer_ratio()¶
元の Fraction と等しい比を表す、2 つの整数のタプルを返します。 この比は既約で、分母は正です。
Added in version 3.8.
- is_integer()¶
Fraction が整数なら
Trueを返します。Added in version 3.12.
- classmethod from_float(f)¶
floatまたはnumbers.Integralのインスタンスだけを受け取る代替コンストラクタです。Fraction.from_float(0.3)はFraction(3, 10)と同じ値ではないことに注意してください。
- classmethod from_decimal(dec)¶
decimal.Decimalまたはnumbers.Integralのインスタンスだけを受け取る代替コンストラクタです。注釈
Python 3.2 以降では、
decimal.Decimalインスタンスから直接Fractionインスタンスを構築できるようになりました。
- limit_denominator(max_denominator=1000000)¶
分母が高々 max_denominator である、
selfに最も近いFractionを見付けて返します。このメソッドは与えられた浮動小数点数の有理数近似を見つけるのに役立ちます:>>> from fractions import Fraction >>> Fraction('3.1415926535897932').limit_denominator(1000) Fraction(355, 113)
あるいは float で表された有理数を元に戻すのにも使えます:
>>> from math import pi, cos >>> Fraction(cos(pi/3)) Fraction(4503599627370497, 9007199254740992) >>> Fraction(cos(pi/3)).limit_denominator() Fraction(1, 2) >>> Fraction(1.1).limit_denominator() Fraction(11, 10)
- __floor__()¶
最大の
int<= selfを返します。このメソッドはmath.floor()関数からでもアクセスできます:>>> from math import floor >>> floor(Fraction(355, 113)) 3
- __ceil__()¶
最小の
int>= selfを返します。このメソッドはmath.ceil()関数からでもアクセスできます。
- __round__()¶
- __round__(ndigits)
第一のバージョンは、
selfに最も近いintを偶数丸めで返します。第二のバージョンは、このメソッドはselfに最も近いFraction(1, 10**ndigits)の倍数 (論理的に、ndigitsが負なら) を、これも偶数丸めで丸めます。round()関数からでもアクセスできます。
- __format__(format_spec, /)¶
str.format()メソッド、組み込み関数format()、フォーマット済み文字列リテラル によるFractionインスタンスの書式化をサポートします。書式指定文字列
format_specが表現型'e'、'E'、'f'、'F'、'g'、'G'、'%'のいずれでも終わらない場合は、書式指定ミニ言語 で説明する埋め文字、配置、符号の処理、最小幅、桁のグループ化の一般的な規則に従って書式化します。 「別形式」のフラグ'#'をサポートします。 これを指定すると、書式化する値が厳密に整数であっても、出力文字列に常に分母を明示します。 ゼロ埋めのフラグ'0'はサポートしません。書式指定文字列
format_specが表現型'e'、'E'、'f'、'F'、'g'、'G'、'%'のいずれかで終わる場合は、Format specification mini-language 節に記載されたfloat型の規則に従って書式化します。ここに例があります:
>>> from fractions import Fraction >>> format(Fraction(103993, 33102), '_') '103_993/33_102' >>> format(Fraction(1, 7), '.^+10') '...+1/7...' >>> format(Fraction(3, 1), '') '3' >>> format(Fraction(3, 1), '#') '3/1' >>> format(Fraction(1, 7), '.40g') '0.1428571428571428571428571428571428571429' >>> format(Fraction('1234567.855'), '_.2f') '1_234_567.86' >>> f"{Fraction(355, 113):*>20.6e}" '********3.141593e+00' >>> old_price, new_price = 499, 672 >>> "{:.2%} price increase".format(Fraction(new_price, old_price) - 1) '34.67% price increase'
参考
numbersモジュール数値の塔を作り上げる抽象基底クラス。