fractions --- 有理數

原始碼: Lib/fractions.py


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

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

class fractions.Fraction(numerator=0, denominator=1)
class fractions.Fraction(number)
class fractions.Fraction(string)

第一個版本要求 numeratordenominatornumbers.Rational 的例項,並返回一個新的 Fraction 例項,其值等於 numerator/denominator。 如果 denominator 為零,則會引發 ZeroDivisionError

第二個版本要求 numbernumbers.Rational 的例項或具有 as_integer_ratio() 方法(這包括 floatdecimal.Decimal)。它會返回一個值完全相同的 Fraction 例項。假設 as_integer_ratio() 方法返回一對互質的整數,且後者為正數。請注意,由於二進位制浮點數的常見問題(參見浮點算術:問題與限制),Fraction(1.1) 的引數不完全等於 11/10,因此 Fraction(1.1) 不會 返回人們可能期望的 Fraction(11, 10)。(但請參閱下文 limit_denominator() 方法的文件。)

建構函式的最後一個版本需要一個字串。此例項的通常形式是

[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() 函式來對 numeratordenominator 進行正規化。math.gcd() 總是返回 int 型別。以前,GCD 的型別取決於 numeratordenominator

在 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 例項進行格式化時,支援填充、對齊、符號處理、最小寬度和分組。

在 3.14 版本發生變更: Fraction 建構函式現在接受任何具有 as_integer_ratio() 方法的物件。

numerator

最簡分數形式的分子。

denominator

最簡分數形式的分母。保證為正數。

as_integer_ratio()

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

在 3.8 版本加入。

is_integer()

如果 Fraction 是整數,則返回 True

3.12 新版功能.

classmethod from_float(f)

備選建構函式,僅接受 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 例項。

classmethod from_number(number)

備選建構函式,只接受 numbers.Integralnumbers.Rationalfloatdecimal.Decimal 的例項,以及帶有 as_integer_ratio() 方法的物件,但不接受字串。

在 3.14 版本加入。

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)

第一個版本返回與 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''%' 這些表示型別之一結尾,那麼格式化將遵循格式規範迷你語言一節中為 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 模組

構成數字塔的抽象基類。