为什么在分数模块中数字字符串(float)和float实例的结果有差异?

时间:2016-03-27 15:51:08

标签: python python-2.7 python-3.x

>>> from fractions import Fraction
>>> Fraction(2.6)
**Fraction(5854679515581645, 2251799813685248)**
>>> Fraction(2.6).limit_denominator(10)
Fraction(13,2)
>>> Fraction('2.6') #Fraction(str(2.6)) or Fraction(repr(2.6))
**Fraction(13,2)**

为什么Fraction不为float实例返回最接近的分数?

1 个答案:

答案 0 :(得分:3)

来自the documentation

  

请注意,由于二进制浮点的常见问题(请参阅Floating Point Arithmetic: Issues and Limitations),Fraction(1.1)的参数不完全等于11/10,因此Fraction(1.1) 会像预期的那样返回Fraction(11, 10)。 (但请参阅下面limit_denominator()方法的文档。)

基本上,2.6无法用二进制精确表示。上面摘录中的问题和限制链接更加详细。

根据建议,您可以使用limit_denominator()来提供帮助:

>>> from fractions import Fraction
>>> Fraction(2.6)
Fraction(5854679515581645, 2251799813685248)
>>> Fraction(2.6).limit_denominator(100)
Fraction(13, 5)

或者,您可以使用字符串输入(您似乎已经发现了它)。