我正在尝试创建一个影响样方的方案。我大部分都成功了,但我遇到了二次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)))
任何人都知道为什么这可能无法正常工作?或者更简单的方法来计算样方也是有用的。
答案 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)
请注意,由于二进制浮点的常见问题(请参阅 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。