1

在下面的代码中,如果 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 值测试相等吗?这些值的计算方法相同。也许除了我所看到的不相等之外,还有更多的精度?有什么方法可以打印该精度或有关如何调试的任何其他想法?

4

3 回答 3

5

是的,比您所看到的更精确。问题是 == 运算符通常不应该与浮点数一起使用。浮点数具有有限的精度和累积舍入误差,以及无法精确存储所有十进制值的不精确性。例如

>>> 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 值,该 epsilon 值表明有多接近被认为足够接近以致相等。

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

于 2011-03-30T03:03:34.523 回答
1

这里

于 2011-03-30T02:53:06.913 回答
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')
于 2011-03-30T02:59:06.087 回答