2011-08-31 78 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'。 –