2014-02-28 99 views
0

當我嘗試使用radius的值作爲字典中的鍵時,出現錯誤信息KeyError: 0.73780000000000001(這是當前半徑的值...請參閱下文): 代碼看起來在某種程度上是這樣的:python中浮點數的位數問題

for n in range(len(myarray)): 
    radius = (np.sqrt(x[n]**2 + y[n]**2)) 

xy值是帶有4位小數例如像花車:

-25.9166 71.0444 

我試圖削減了小數的:

for n in range(len(myarray)): 
    radius = (int(np.sqrt(x[n]**2 + y[n]**2))*10000)/10000.0 

我不明白爲什麼它給我回個奇怪的值0.73780000000000001

+5

由於累積舍入誤差,鎖定浮點數不是一個好主意。請參閱[每位計算機科學家有關浮點運算的知識](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 –

+0

謝謝,但我不是計算機科學家,我只用python進行數據分析。你知道我怎麼能解決這個問題? – user3041107

+1

你能否給我們更多關於你想要達到的內容的背景,以及你維護一個半徑上的字典的目的是什麼?可能有更好的方法來解決你的問題。 –

回答

3

首先,我真的不明白你的問題:

>>> (np.sqrt(x**2 + y**2)) 
75.623917690899873 
>>> (int(np.sqrt(x**2 + y**2))*10000)/10000.0 
75.0 

其次,作爲@frederic -hamidi說,你應該瞭解更多關於浮點運算的知識,也被稱爲IEEE754 numbers,它們是這樣構建的:

IEEE754 rep

這是構建基於二進制的「科學記數法」。關於這一點的好處是,它可以實現浮動的真正廣泛的表達,壞處是您可能會遇到感覺不自然的近似值,但是因爲它在二進制指數符號中是有意義的,而不是十進制表示形式。此外,您可能會得到如NaN(不是數字)或無窮大的值。

雖然您給我們的計算結果不給0.73780000000000001,但這個數字正是您在IEEE754計算中可以得到的近似值。 (雖然我不會了解如何得到它)

最後,你不應該使用浮點數作爲鍵。相反,使用整數表示你可以使用:

>>> (int(np.sqrt(x**2 + y**2))*10000)/10000 
75 

通過對最後分數去掉.0,所以你不提倡左側整數浮動。