¿Redondeando en numpy?

Tengo un problema extraño con los pandas python y numpy.

>>> np.float64(1) * np.float64(85000) * np.float64(7.543709) 641215.26500000001 >>> round( np.float64(1) * np.float64(85000) * np.float64(7.543709), 2 ) 641215.26000000001 >>> np.round( np.float64(1) * np.float64(85000) * np.float64(7.543709), 2 ) 641215.26000000001 

¿Cómo redondear para obtener el resultado correcto 641215.27?

El método redondo de Numpy favorece los números pares, eche un vistazo al código fuente abreviado de números:

 def round_(a, decimals=0, out=None): return around(a, decimals=decimals, out=out) def around(a, decimals=0, out=None): """ Evenly round to the given number of decimals. Notes ----- For values exactly halfway between rounded decimal values, NumPy rounds to the nearest even value. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round to 0.0, etc. Results may also be surprising due to the inexact representation of decimal fractions in the IEEE floating point standard [1]_ and errors introduced when scaling by powers of ten. Examples -------- >>> np.around([0.37, 1.64]) array([ 0., 2.]) >>> np.around([0.37, 1.64], decimals=1) array([ 0.4, 1.6]) >>> np.around([.5, 1.5, 2.5, 3.5, 4.5]) # rounds to nearest even value array([ 0., 2., 2., 4., 4.]) >>> np.around([1,2,3,11], decimals=1) # ndarray of ints is returned array([ 1, 2, 3, 11]) >>> np.around([1,2,3,11], decimals=-1) array([ 0, 0, 0, 10]) """ 

Ejemplo:

Si necesita imprimir la cadena, puede formatearla para darle la respuesta correcta:

 import numpy as np num = np.float64(1) * np.float64(85000) * np.float64(7.543709) print(num) print(float("{0:.2f}".format(num))) print(np.round(num, 2)) print() num += 0.02 print(num) print(float("{0:.2f}".format(num))) print(np.round(num, 2)) 

te dio

 641215.265 641215.27 641215.26 641215.285 641215.29 641215.28 

Sí, pero no puede usar round( float(num), 2 ) cuando trabaja con marcos de datos:

por ejemplo: df.first * df.second * df.third ¿Cómo redondear en ese caso? ¿No puedes hacer float(dt.first) ?

Esta es una solución: df.first.apply(lambda x: round(float(x), 2)) Pero creo que no es rápido …