在下面的代码中,如果x0 == x1和y0 == y1,那么它应该告诉我。在我正在使用的例子中,它们是。但是,Python只是说x值相等,而不是y。
以下是代码:
print "arc2x0 = ", arc2x0, ", arc2x1 = ", arc2x1
print "arc2y0 = ", arc2y0, ", arc2y1 = ", arc2y1
if arc2x0 == arc2x1:
print "x0 == x1"
else:
print "x0 != x1"
if arc2y0 == arc2y1:
print "y0 == y1"
else:
print "y0 != y1"
这是输出:
arc2x0 = 5 , arc2x1 = 5.0
arc2y0 = -4.16026900507 , arc2y1 = -4.16026900507
x0 == x1
y0 != y1
知道为什么y值测试相同吗?这些值以相同的方式计算。也许除了我所看到的不平等之外还有更多的精确度?有关如何调试此精度或任何其他想法的任何方法吗?
答案 0 :(得分:5)
是的,除了你所看到的更精确之外。问题是==运算符通常不应该与浮点数一起使用。浮点数具有有限的精度并且累积舍入误差,并且由于不能精确地存储所有十进制值而不精确。 e.g。
>>> print '%.18f' % 0.1
0.100000000000000006
>>> 0.4 - 0.3 == 0.1
False
比较浮点数是否相等的最佳方法是比较它们是否几乎相等:
def nearly_equal(x, y, epsilon=1e-7):
return abs(x - y) < epsilon
通过比较浮点数之间的差异是否小于epsilon值,这表示认为接近的距离足够接近等于。
您始终可以使用decimal.Decimal类型来避免这些问题。
答案 1 :(得分:1)
请参阅here。
答案 2 :(得分:1)
这是由于浮点的工作原理,你应该手动截断数字以强制精确到你想要的数字:
a=-4.16026900507
figures =9
a=round(a*(10**figures))/(10**figures) # truncates the digits
print a
但我认为最好的方法是使用十进制:
from decimal import *
a = Decimal ('your number as a string')