其他的数字类型——分数类型——分数转换和混合类型 | 第二部分 类型与操作 —— 第 5 章: 数字类型 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-大发黄金版app下载
为支持分数转换:浮点对象现在有一个返回分子和分母比值的方法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的库手册和其他文档。