为什么这些浮标被评估为平等?

mix*_*mix 1 python printing equivalent

在下面的代码中,如果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"
Run Code Online (Sandbox Code Playgroud)

这是输出:

arc2x0 =  5 , arc2x1 =  5.0
arc2y0 =  -4.16026900507 , arc2y1 =  -4.16026900507
x0 == x1
y0 != y1
Run Code Online (Sandbox Code Playgroud)

知道为什么y值测试相同吗?这些值以相同的方式计算.也许除了我所看到的不平等之外还有更多的精确度?有关如何调试此精度或任何其他想法的任何方法?

Elo*_*off 5

是的,除了你所看到的更精确之外.问题是==运算符通常不应该与浮点数一起使用.浮点数具有有限的精度并且累积舍入误差,并且由于不能精确地存储所有十进制值而不精确.例如

>>> print '%.18f' % 0.1
0.100000000000000006

>>> 0.4 - 0.3 == 0.1
False
Run Code Online (Sandbox Code Playgroud)

比较浮点数是否相等的最佳方法是比较它们是否几乎相等:

def nearly_equal(x, y, epsilon=1e-7):
    return abs(x - y) < epsilon
Run Code Online (Sandbox Code Playgroud)

通过比较浮点数之间的差异是否小于epsilon值,这表示认为接近等于接近的接近程度.

您始终可以使用decimal.Decimal类型来避免这些问题.