2013-08-07 192 views
5

我必須比較兩個數字。其中一個來自Regulat python代碼,另一個來自numpy。調試器顯示它們具有相同的值'29.0',但第一種類型爲float,第二種類型爲float64,所以a == ba - b == 0False。我該如何處理它?有沒有什麼辦法可以強制一個普通的python變量默認爲float64或numpy使用float在Python中比較`float`和`float64`

更新:所有這些值的最後來自同一個文件,其中29.0被寫入,所以我不認爲數值有差異。

+1

由於精度錯誤,通常比較任何兩個浮點數與'a == b'或'a - b == 0'是一個壞主意。嘗試做一些像「abs(a - b)<1e-8」之類的東西。 – wflynny

+1

浮點表示和算術不準確(mantisse和truncature pb)。設置最大差異的ε(通常爲10e-10)。 – lucasg

+0

雖然這些評論通常都是正確的,但如果它來自一個可能是ASCII格式的文件,我無法想象出值爲29.0的精確錯誤。可以精確地表示29.0。 – glglgl

回答

12

你不應該在任何編程語言中將浮點數與平等進行比較,因爲你永遠不會知道它們完全相等。相反,你應該測試他們的差異是否小於公差小:

if abs(a - b) < 1e-10 

所以這個問題不會有floatfloat64(Python的自動轉換它們)之間的區別做,但根本問題比較花車平等。

What's wrong with using == to compare floats in Java?

+0

好點。我期待錯誤的一面 – xander27

+0

謝謝。)因此,我忘了這個基本的東西 – xander27

+0

實際上,您可以使用符號數學計算的語言將數字與平等進行比較 –

7

看到,如果你正在使用numpy的,該怎麼辦安東尼已經建議最好的辦法是使用功能np.allclose(a, b)。您也可以指定公差(從上面的1e-10)。