2011-03-30 61 views
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值是測試爲平等的嗎?這些值以相同的方式計算。也許有更多的精確度超出我所看到的不等於?任何方式來打印精度或任何其他想法如何調試?

+1

使用decimal.Decimal – 2011-03-30 02:51:11

+1

'打印「arc2y0 =%R,arc2y1 =%R」%(arc2y0,arc2y1)'你會看到你的號碼是不完全等於 – 2011-03-30 03:19:18

回答

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 

通過比較,如果浮子之間的差值小於的ε值,這表明是多麼接近認爲足夠接近是平等的。

您可以隨時使用decimal.Decimal類型來避免這些問題。

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') 
+0

你比較彩車時不管得到類似的問題精度是多少。如果你提倡使用numpy,因爲它具有更高精度的浮點數,那就錯了。 – Paddy3118 2011-03-30 05:54:53

+0

@ Paddy3118我剛剛檢查過,你是對的,我無法找到我讀的那個Numpy有那個,無論如何,我編輯答案 – P2bM 2011-03-30 07:00:34