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)
da2.67
lugar del esperado2.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