2017-07-27 75 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])