fractions — 有理數

原始碼: Lib/fractions.py


fractions 模組為有理數算術提供了支援。

Fraction 例項可以從一對整數、另一個有理數或字串構造。

class fractions.Fraction(numerator=0, denominator=1)
class fractions.Fraction(other_fraction)
class fractions.Fraction(float)
class fractions.Fraction(decimal)
class fractions.Fraction(string)

第一個版本要求 *numerator* 和 *denominator* 是 numbers.Rational 的例項,並返回一個新的 Fraction 例項,其值為 numerator/denominator。如果 *denominator* 為 0,則會引發 ZeroDivisionError。第二個版本要求 *other_fraction* 是 numbers.Rational 的例項,並返回一個值相同的 Fraction 例項。接下來的兩個版本接受 floatdecimal.Decimal 例項,並返回一個值完全相同的 Fraction 例項。請注意,由於二進位制浮點數的常見問題(請參閱 浮點數算術:問題和限制),Fraction(1.1) 的引數不完全等於 11/10,因此 Fraction(1.1) 不會 返回 Fraction(11, 10),正如人們可能期望的那樣。(但請參閱下面的 limit_denominator() 方法的文件。)建構函式的最後一個版本需要一個字串或 unicode 例項。此例項的常見形式是

[sign] numerator ['/' denominator]

其中可選的 sign 可以是“+”或“-”,並且 numeratordenominator(如果存在)是十進位制數字字串(可以使用下劃線來分隔數字,就像程式碼中的整數文字一樣)。此外,任何表示有限值且被 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 例項是 可雜湊的,應被視為不可變的。此外,Fraction 具有以下屬性和方法

在 3.2 版本中更改: Fraction 建構函式現在接受 floatdecimal.Decimal 例項。

在 3.9 版本中更改: math.gcd() 函式現在用於規範化 *numerator* 和 *denominator*。math.gcd() 始終返回 int 型別。以前,GCD 型別取決於 *numerator* 和 *denominator*。

在 3.11 版本中更改: 按照 PEP 515 規則,現在允許在從字串建立 Fraction 例項時使用下劃線。

在 3.11 版本中更改: Fraction 現在實現了 __int__ 以滿足 typing.SupportsInt 例項檢查。

在 3.12 版本中更改: 允許在字串輸入中的斜槓周圍使用空格:Fraction('2 / 3')

在 3.12 版本中更改: Fraction 例項現在支援浮點型格式化,具有表示型別 "e""E""f""F""g""G""%"

在 3.13 版本中更改: 現在,不帶表示型別的 Fraction 例項的格式化支援填充、對齊、符號處理、最小寬度和分組。

numerator

最簡形式的分數的分子。

denominator

最簡形式的分數的分母。

as_integer_ratio()

返回一個由兩個整陣列成的元組,其比率等於原始 Fraction。該比率是最簡形式,並且具有正分母。

3.8 版本新增。

is_integer()

如果 Fraction 是整數,則返回 True

3.12 版本新增。

classmethod from_float(flt)

僅接受 floatnumbers.Integral 例項的替代建構函式。請注意,Fraction.from_float(0.3) 的值與 Fraction(3, 10) 的值不同。

註解

從 Python 3.2 開始,您也可以直接從 float 構造 Fraction 例項。

classmethod from_decimal(dec)

備用建構函式,僅接受 decimal.Decimalnumbers.Integral 的例項。

註解

從 Python 3.2 開始,你也可以直接從 decimal.Decimal 例項構造一個 Fraction 例項。

limit_denominator(max_denominator=1000000)

查詢並返回最接近 self 且分母最大為 max_denominator 的 Fraction。此方法對於查詢給定浮點數的有理近似值非常有用

>>> from fractions import Fraction
>>> Fraction('3.1415926535897932').limit_denominator(1000)
Fraction(355, 113)

或者用於恢復表示為浮點數的有理數

>>> 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__()

返回小於等於 self 的最大 int。此方法也可以透過 math.floor() 函式訪問

>>> from math import floor
>>> floor(Fraction(355, 113))
3
__ceil__()

返回大於等於 self 的最小 int。此方法也可以透過 math.ceil() 函式訪問。

__round__()
__round__(ndigits)

第一個版本返回最接近 selfint,四捨五入到偶數。第二個版本將 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''%' 之一結尾,則格式化遵循 格式規範微語言 部分中為 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

構成數值塔的抽象基類。