跳转到内容

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

参考文献[编辑 | 编辑源代码]