2011-08-31 20 views
6

Tengo un problema con np.round, np.around donde no se redondea correctamente. No puedo incluir el código, porque cuando lo hago ajustar manualmente el valor (en lugar de utilizar los datos de mi), las obras de retorno, pero aquí está la salida:Problemas con el redondeo de flotadores en 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 

¿Qué me falta? La dtype de a es float32, ¿necesito cambiar esto?

+4

aquí. lea todo [eso] (http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf) – JBernardo

+2

¿Cuál es su resultado esperado? Tal vez eche un vistazo al tipo [decimal] (http://docs.python.org/library/decimal.html) de python si realmente debe tener un valor "exacto". – jozzas

+0

'np' es Numpy ?? –

Respuesta

5

Intente crear np.float32(0.01) y verá su respuesta. Obtiene la precisión que ya puede.

>>> 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

Veo lo que quiere decir, pero ¿hay algún tipo diferente en el que pueda cambiarlo para evitar este problema? – mike

+1

sí, por ejemplo 'np.float64' .. pero tenga en cuenta que no evita el" problema ", solo reduce el error. – wim

+1

abstracción clásica con fugas (http://www.joelonsoftware.com/articles/LeakyAbstractions.html). Bienvenido a carrozas – Simon

0

Nota parece que hay un problema con la función del pitón round y numpy.float64 tipos. Consulte el siguiente ejemplo:

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

La única manera de que pudiera solucionar este problema es convertir el numpy.float64 a un flotador antes de utilizar la función de redondeo de la siguiente manera:

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

Este método no parece funcionar para mi. Si 'x = 5672.1001', entonces' np.round (float (np.float64 (x)), 1) 'produce' 5672.1000000000004'. –