2017-07-27 40 views
1

親愛的Python社區,numpy的陣列四捨五入不工作

我想數據點之間插值,但想保持我的結果到3位小數,所以我定義了以下功能:

import numpy 

def spline(y, x , xnew): 
    from scipy import interpolate 
    model = interpolate.splrep(x,y) 
    ynew = interpolate.splev(xnew,model) 
    result = ynew.round(3) 

    return result 

這似乎給我下面的簡單示例預期的結果:

x = [1,2,3,4,5,7,10] 
y = [1.31,1.883,2.285,2.572,2.809,3.024,3.208] 
z = spline(y,x, np.arange(1,11)) 

其產生預期:

Out[109]: 
array([ 1.31 , 1.883, 2.285, 2.572, 2.809, 2.954, 3.024, 3.062, 
     3.109, 3.208]) 

但是,當我試圖檢索一個特定的值時,它似乎不是四捨五入。我該如何解決這個問題?下面我

z[3] 
Out[110]: 2.5720000000000001 

答案如下嘗試:

t= 2.572 
t 
Out[119]: 2.572 
type(t) 
Out[120]: float 

,所以我不明白爲什麼現在它可以有完全2.572或者是有一個隱含的3位小數在我的T的高清顯示性能?

+0

即已知的任何行爲編程語言。發生這種情況是因爲十進制數字2.572的確切表示需要無限數字的二進制數字 – nanojohn

+2

因此,'2.5720000000000001'最接近'2.572',可以用Python'float'表示。 – JohanL

+0

你的實際用例是什麼?你真的需要它精確到三位小數嗎?那麼你應該考慮使用'Decimal'類。 – JohanL

回答

0

這是任何編程語言的已知行爲。這是因爲十進制數2.572的確切表示需要無限多的二進制數字

如果你想只顯示小數點後3位,您可以使用str.format()功能:

'{0:.3f}'.format(z[3])