round float decimals decimales and python python-3.x floating-point rounding

float - Python3 redondeando al más cercano incluso



python round float to int (3)

Python3.4 se redondea al par más cercano (en el caso de desempate).

>>> round(1.5) 2 >>> round(2.5) 2

Pero solo parece hacer esto cuando se redondea a un entero.

>>> round(2.75, 1) 2.8 >>> round(2.85, 1) 2.9

En el ejemplo final anterior, habría esperado 2.8 como respuesta al redondear al par más cercano.

¿Por qué hay una discrepancia entre los dos comportamientos?


Los números de punto flotante son solo aproximaciones ; 2.85 no puede ser representado exactamente :

>>> format(2.85, ''.53f'') ''2.85000000000000008881784197001252323389053344726562500''

Es un poco más de 2,85.

0.5 y 0.75 se pueden representar exactamente con fracciones binarias (1/2 y 1/2 + 1/4, respectivamente).

La función round() documenta esto explícitamente :

Nota : el comportamiento de round() para flotadores puede ser sorprendente: por ejemplo, round(2.675, 2) da 2.67 lugar del esperado 2.68 . Esto no es un error: es el resultado del hecho de que la mayoría de las fracciones decimales no se pueden representar exactamente como un flotador. Consulte Aritmética de punto flotante: problemas y limitaciones para obtener más información.


Martijn lo entendió exactamente bien. Si quieres un redondeado internacional para redondear al par más cercano, entonces me gustaría ir con esto:

def myRound(n): answer = round(n) if not answer%2: return answer if abs(answer+1-n) < abs(answer-1-n): return answer + 1 else: return answer - 1


Para responder al título ... Si usa int(n) , se trunca hacia cero. Si el resultado no es uniforme, entonces agrega uno:

n = 2.7 # your whatever float result = int(n) if not (result & 1): result += 1