数字0.6未正确转换为分数

时间:2014-03-21 20:43:59

标签: python fractions

我正在尝试创建一个影响样方的方案。我大部分都成功了,但我遇到了二次5x^2 -13x + 6的问题,其中一个根是0.6或3/5。我想把它写成一个分数,但它无法正常工作。它给了我以下内容:

5(x - 2)(x - 5404319552844595/9007199254740992)

这是我从分数导入后使用的代码:

    s1 = Fraction(((-b + sqrt(disc))/(2*a)))
    s2 = Fraction(((-b - sqrt(disc))/(2*a)))

任何人都知道为什么这可能无法正常工作?或者更简单的方法来计算样方也是有用的。

2 个答案:

答案 0 :(得分:9)

>>> from fractions import Fraction
>>> Fraction(0.6)
Fraction(5404319552844595, 9007199254740992)
>>> Fraction("0.6")
Fraction(3, 5)

0.6无法完全表示为二进制float。见Floating Point Arithmetic: Issues and Limitations。这不是Python问题,它是浮点数如何工作的问题。

答案 1 :(得分:1)

引用Python manual

  

请注意,由于二进制浮点的常见问题(请参阅   Floating Point Arithmetic: Issues and Limitations),论证   分数(1.1)不完全等于11/10,因此分数(1.1)确实如此   不会像人们预期的那样返回分数(11,10)。

当你知道分子和分母必须小的情况下建议的处理方法是limit the denominator。这是一个例子:

from math import sqrt
from fractions import Fraction
a, b, c = 5, -13, 6
disc = b * b - 4 * a * c
s1 = Fraction(((-b + sqrt(disc))/(2*a)))
s2 = Fraction(((-b - sqrt(disc))/(2*a)))
print (s1, s2)
s1, s2 = s1.limit_denominator (), s2.limit_denominator ()
print (s1, s2)

第一个打印你提到的部分,第二个打印3/5。