在下面的代码中,如果 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 值被测试为相等吗?这些值以相同的方式计算。也许除了我所看到的不平等之外,还有更多的精确度?有什么方法可以打印该精度或关于如何调试它的任何其他想法?
请您参考如下方法:
是的,比您所看到的更精确。问题是 == 运算符通常不应与 float 一起使用。 float 具有有限的精度和累积的舍入误差,以及无法精确存储所有小数值的不精确性。例如
>>> print '%.18f' % 0.1
0.100000000000000006
>>> 0.4 - 0.3 == 0.1
False
比较 float 是否相等的最好方法是比较它们是否几乎相等:
def nearly_equal(x, y, epsilon=1e-7):
return abs(x - y) < epsilon
通过比较 float 之间的差异是否小于 epsilon 值,这表明接近程度被认为足够接近以至于相等。
您始终可以使用 decimal.Decimal 类型来避免这些问题。
