用戶:Xyy23330121/Python/fractions
外觀
浮點數產生捨入誤差的原因,在於無限循環小數無法被準確表示。那麼,不使用無限循環小數不就好了?fractions 模塊中,fractions.Fraction 類使用整數的分數形式來表示無限循環小數,從而解決捨入誤差問題。
float、int 以及 decimal.Decimal 擁有同名的實例方法:as_integer_ratio()
。這個方法會返回一個 (分子,分母)
的元組,使得:
- 分子和分母都是整數
- 分子/分母 是最簡分數
- 分數的值和原實例的值完全相等
「完全相等」可能不好理解。因為在使用時,除非要求特別精確的計算,我們都是把浮點數當成實數來考慮的。而在實數中,無理數無法表示為整數的分數形式。但是,換一個角度後,這件事情就很好理解。考慮到 float 和 decimal 的原理:
+m*2**n
+m*10**n
不難發現對 float 而言,分母部分一定是 2 的冪次;而對 decimal 而言,分母部分一定是 10 的冪次——肯定是可以用整數表示的。只要再化為最簡分數即可。
我們可以用類型構造器來創建 fractions.Fraction
實例。類型構造器的方法,總結起來是以下兩種:
- class fractions.Fraction(numerator=0, denominator=1)
- class fractions.Fraction(num)
第一種方法輸入分子和分母,獲得對應的分數。而第二種方法直接將內容轉換為分數。可以轉換的內容有:
- int、float 和 decimal
- 表示整數或分數的字符串,比如"12"、"-12/5"等。
numbers.Rational
的子類的實例[1]。
屬性 | 註釋 |
---|---|
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 進行字符串格式化的方式和浮點數完全一致。