2011-08-31 79 views
6

我遇到np.round,np.around的問題,它沒有正確舍入。我不能包含的代碼,因爲當我做手工設置的值(而不是用我的數據),返回工作,但這裏是輸出:在Python中舍入遊標的問題

In [177]: a 
Out[177]: 0.0099999998 

In [178]: np.round(a,2) 
Out[178]: 0.0099999998 


In [179]: np.round(a,1) 
Out[179]: 0.0 

我缺少什麼? a的dtype是float32,我需要改變它嗎?

+4

這裏。閱讀所有[that](http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf) – JBernardo

+2

您的預期產出是什麼?也許看看python的[decimal](http://docs.python.org/library/decimal.html)類型,如果你真的必須有一個「確切」的值。 – jozzas

+0

'np'是Numpy? –

回答

5

嘗試創建np.float32(0.01),你會看到你的答案。你已經獲得了精確度。

>>> import numpy as np 
>>> x = 0.01 
>>> epsilon = 0.01 - np.float32(0.01) 
>>> for n in np.arange(x - 10*epsilon, x + 10*epsilon, epsilon): 
...  print(repr(np.float32(n))) 
...  
0.0099999979 
0.0099999979 
0.0099999979 
0.0099999988 
0.0099999988 
0.0099999988 
0.0099999988 
0.0099999998 
0.0099999998 
0.0099999998 
0.0099999998 
0.0099999998 
0.010000001 
0.010000001 
0.010000001 
0.010000001 
0.010000002 
0.010000002 
0.010000002 
0.010000002 
+0

我明白你的意思了,但是爲了避免這個問題,我可以改變它的類型嗎? – mike

+1

是的,例如'np.float64' ..但是請注意,它不會避免「問題」,它只會使錯誤更小。 – wim

+1

經典泄漏抽象(http://www.joelonsoftware.com/articles/LeakyAbstractions.html)。歡迎來到花車。 – Simon

0

注意,似乎是python的round功能和numpy.float64類型的問題。見下面的例子:

In [88]: round(np.float64(16.259766999999947), 4) 
Out[88]: 16.259799999999998 

我能解決這個問題的唯一方法是使用下面的循環函數之前的numpy.float64轉換爲浮動:

In [89]: round(float(np.float64(16.259766999999947)), 4) 
Out[89]: 16.2598 
+0

這種方法似乎不起作用爲了我。如果'x = 5672.1001',那麼'np.round(float(np.float64(x)),1)'產生'5672.1000000000004'。 –