其他的数字类型——分数类型——分数转换和混合类型

未匹配的标注

为支持分数转换:浮点对象现在有一个返回分子和分母比值的方法as_integer_ratio;分数有from_float方法;float接收分数作为参数。跟着下面的交互来看这些方法是如何工作的(第二个测试中的*是特殊语法,它将元组展开为一个个的参数;更多参见第18章中的函数参数传递):

>>> (2.5).as_integer_ratio() # 浮点对象方法
(5, 2)
>>> f = 2.5
>>> z = Fraction(*f.as_integer_ratio()) # 转换 浮点数 -> 分数: 两个参数
>>> z # 同 Fraction(5, 2) 一样
Fraction(5, 2)
>>> x # x 来自之前的会话
Fraction(1, 3)
>>> x + z
Fraction(17, 6) # 5/2 + 1/3 = 15/6 + 2/6
>>> float(x) # 转换 分数 -> 浮点数
0.3333333333333333
>>> float(z)
2.5
>>> float(x + z)
2.8333333333333335
>>> 17 / 6
2.8333333333333335
>>> Fraction.from_float(1.75) # 转换 浮点数 -> 分数: 其他方法
Fraction(7, 4)
>>> Fraction(*(1.75).as_integer_ratio())
Fraction(7, 4)

最后,在表达式中是允许一些类型混合的,然而 分数有时必须手动传递来保持精确度(译注:即 x + Fraction(4, 3))。研究下面的交互来看是如何工作的:

>>> x
Fraction(1, 3)
>>> x + 2 # 分数 + 整数 -> 分数
Fraction(7, 3)
>>> x + 2.0 # 分数 + 浮点数 -> 浮点数
2.3333333333333335
>>> x + (1./3) # 分数 + 浮点数 -> 浮点数
0.6666666666666666
>>> x + (4./3)
1.6666666666666665
>>> x + Fraction(4, 3) # 分数 + 分数 -> 分数
Fraction(5, 3)

警告:虽然可以从浮点数转换为分数,但在一些情况下这么做时还是会有不可避免的精度损失,因为其原始的浮点形式的数字就是不准确的。当需要时,可以通过限制最大分母的值来简化这种结果:

>>> 4.0 / 3
1.3333333333333333
>>> (4.0 / 3).as_integer_ratio() # 从浮点数损失的精度
(6004799503160661, 4503599627370496)
>>> x
Fraction(1, 3)
>>> a = x + Fraction(*(4.0 / 3).as_integer_ratio())
>>> a
Fraction(22517998136852479, 13510798882111488)
>>> 22517998136852479 / 13510798882111488. # 5 / 3 (或接近它!)
1.6666666666666667
>>> a.limit_denominator(10) # 简化到最近的分数
Fraction(5, 3)

要获得关于分数类型的更多细节,请自行实验并参考Python 2.6,2.7和3.X的库手册和其他文档。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~