用戶:Xyy23330121/Python/fractions

來自維基學院


浮點數產生捨入誤差的原因,在於無限循環小數無法被準確表示。那麼,不使用無限循環小數不就好了?fractions 模塊中,fractions.Fraction 類使用整數的分數形式來表示無限循環小數,從而解決捨入誤差問題。

as_integer_ratio[編輯 | 編輯原始碼]

float、int 以及 decimal.Decimal 擁有同名的實例方法:as_integer_ratio()。這個方法會返回一個 (分子,分母) 的元組,使得:

  1. 分子和分母都是整數
  2. 分子/分母 是最簡分數
  3. 分數的值和原實例的值完全相等

「完全相等」可能不好理解。因為在使用時,除非要求特別精確的計算,我們都是把浮點數當成實數來考慮的。而在實數中,無理數無法表示為整數的分數形式。但是,換一個角度後,這件事情就很好理解。考慮到 float 和 decimal 的原理:

  1. +m*2**n
  2. +m*10**n

不難發現對 float 而言,分母部分一定是 2 的冪次;而對 decimal 而言,分母部分一定是 10 的冪次——肯定是可以用整數表示的。只要再化為最簡分數即可。

創建 Fraction[編輯 | 編輯原始碼]

我們可以用類型構造器來創建 fractions.Fraction 實例。類型構造器的方法,總結起來是以下兩種:

  • class fractions.Fraction(numerator=0, denominator=1)
  • class fractions.Fraction(num)

第一種方法輸入分子和分母,獲得對應的分數。而第二種方法直接將內容轉換為分數。可以轉換的內容有:

  1. int、float 和 decimal
  2. 表示整數或分數的字符串,比如"12"、"-12/5"等。
  3. numbers.Rational的子類的實例[1]

Fraction 的屬性與方法[編輯 | 編輯原始碼]

屬性 註釋
numerator 最簡分數形式的分子
denominator 最簡分數形式的分母
方法 註釋
as_integer_ratio() 返回 (self.numerator, self.denominator)
limit_denominator(max_denominator=10**6) 找到並返回分母小於 max_denominator
的、最接近的分數。
特殊方法 註釋
__floor__() 對 math.floor 函數的支持
__ceil__() 對 math.ceil 函數的支持
__round__(ndigits = None) 對 round 函數的支持
__format__(format_spec, /) 對字符串格式化的支持

字符串格式化[編輯 | 編輯原始碼]

由於 fractions 模塊的特殊設計,fractions.Fraction 進行字符串格式化的方式和浮點數完全一致。

參考文獻[編輯 | 編輯原始碼]