User: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 进行字符串格式化的方式和浮点数完全一致。