2013-05-15 85 views
0

Verison 2.6.5如果有幫助。 因此,我在django中做了一些東西,並從Floatfield獲取了一個值。並將它與另一個floatfield進行比較。我們稱之爲2 X和Y. 當我運行它時,X最終會變成35.0。當我運行它時,Y最終以35.0結束。Python的浮點問題?

35.0 > 35.0 # False, ok no worries 
X > Y # True, why? 
round(X) > round(Y) # False, ok looks like i have to round it 

我知道浮動計算過程,但在這種情況下有問題,爲35.0,所以我認爲他們實際上是被35.0顯示我的兩個變量的值。這是否意味着python可能不會在float對象後面顯示一些信息?我知道這是一個常見的問題,但如果它實際上是35.000000001什麼的,python是不是顯示整個值?

編輯:好的,最後通讀這一點。浮點生活問題現在解決了我大聲笑。 http://docs.python.org/2/tutorial/floatingpoint.html

+0

http://stackoverflow.com/questions/16551128/python-float-rounding-errors/16551150 –

+0

所以實際上,我還有一個問題。我知道會發生,但python不顯示它? 35.0實際上意味着像35.000000000001? – dtc

+0

基本上......浮點不精確 –

回答

2

Python在打印/表示它們時有時會捨去浮點值*,但在比較它們時不會這樣做。

試試這個:

'{:.17f} {:.17f}'.format(X, Y) 

(由於彩車剛剛超過17個的精度顯著數字,您的號碼範圍[10, 100),打印17個數字應該足以看到所有存在的細節。但如果你不知道如何來計算的話,只是折騰一些額外位數:{:.64f}是完全合法的)

或者,你可以將它們轉換爲Decimal對象具有足夠高的精度來表示區別,還是。許多其他的事情。

,或者最簡單地說,X > YX是否比Y更大的一個很好的測試,如果這就是你真正想知道的。


對於現實生活中的代碼,如果你想知道這是否是由於兩種不同的計算兩個浮點值是「相同的」,你不能這樣做。理想情況下,你需要做適當的錯誤分析。如果不這樣做,那麼ε計算(如果您關心固定比例,則爲abs(X-Y) < EPSILON,如果您不知道比例尺是什麼,則爲abs((X-Y)/(X+Y)) < EPSILON)通常足夠好。但X == Y從來沒有夠好。


*不同Python版本的細節有所不同。例如,試試這個:

>>> str(1.000000000000001), repr(1.000000000000001) 

在Python 2.7,你會得到:

'1.0', '1.000000000000001' 

但是在Python 3。3:

'1.000000000000001', '1.000000000000001' 
+0

感謝您的明確解釋。 – dtc

0

除了對像0這樣已知精確字面值的簡單測試外,不要在浮點數之間做簡單的比較。

總是減去並測試看差異的絕對值是否低於epsilon。如果是這樣,請將兩個浮動視爲平等。如果差異大於epsilon,則使用其符號來確定哪個大於另一個。

+0

好的謝謝,做X-Y幫助了我。當我顯示X和Y時,它沒有顯示任何超過第一位小數的任何東西。 – dtc