int(round(x))
Lo redondeará y lo cambiará a entero
EDITAR:
No está asignando int (round (h)) a ninguna variable. Cuando llama a int (round (h)), devuelve el número entero pero no hace nada más; tienes que cambiar esa línea por:
h = int(round(h))
Para asignar el nuevo valor a h
EDITAR 2:
Como @plowman dijo en los comentarios, Python round()
no funciona como uno esperaría normalmente, y eso se debe a que la forma en que se almacena el número como variable generalmente no es la forma en que lo ves en la pantalla. Hay muchas respuestas que explican este comportamiento:
round () no parece estar redondeando correctamente
Una forma de evitar este problema es usar el decimal como se indica en esta respuesta: https://stackoverflow.com/a/15398691/4345659
Para que esta respuesta funcione correctamente sin usar bibliotecas adicionales, sería conveniente usar una función de redondeo personalizada. Después de muchas correcciones, se me ocurrió la siguiente solución, que por lo que probé evitó todos los problemas de almacenamiento. Se basa en el uso de la representación de cadena, obtenida con repr()
( str()
¡ NO !). Parece hacky pero fue la única forma que encontré para resolver todos los casos. Funciona con Python2 y Python3.
def proper_round(num, dec=0):
num = str(num)[:str(num).index('.')+dec+2]
if num[-1]>='5':
return float(num[:-2-(not dec)]+str(int(num[-2-(not dec)])+1))
return float(num[:-1])
Pruebas:
>>> print(proper_round(1.0005,3))
1.001
>>> print(proper_round(2.0005,3))
2.001
>>> print(proper_round(3.0005,3))
3.001
>>> print(proper_round(4.0005,3))
4.001
>>> print(proper_round(5.0005,3))
5.001
>>> print(proper_round(1.005,2))
1.01
>>> print(proper_round(2.005,2))
2.01
>>> print(proper_round(3.005,2))
3.01
>>> print(proper_round(4.005,2))
4.01
>>> print(proper_round(5.005,2))
5.01
>>> print(proper_round(1.05,1))
1.1
>>> print(proper_round(2.05,1))
2.1
>>> print(proper_round(3.05,1))
3.1
>>> print(proper_round(4.05,1))
4.1
>>> print(proper_round(5.05,1))
5.1
>>> print(proper_round(1.5))
2.0
>>> print(proper_round(2.5))
3.0
>>> print(proper_round(3.5))
4.0
>>> print(proper_round(4.5))
5.0
>>> print(proper_round(5.5))
6.0
>>>
>>> print(proper_round(1.000499999999,3))
1.0
>>> print(proper_round(2.000499999999,3))
2.0
>>> print(proper_round(3.000499999999,3))
3.0
>>> print(proper_round(4.000499999999,3))
4.0
>>> print(proper_round(5.000499999999,3))
5.0
>>> print(proper_round(1.00499999999,2))
1.0
>>> print(proper_round(2.00499999999,2))
2.0
>>> print(proper_round(3.00499999999,2))
3.0
>>> print(proper_round(4.00499999999,2))
4.0
>>> print(proper_round(5.00499999999,2))
5.0
>>> print(proper_round(1.0499999999,1))
1.0
>>> print(proper_round(2.0499999999,1))
2.0
>>> print(proper_round(3.0499999999,1))
3.0
>>> print(proper_round(4.0499999999,1))
4.0
>>> print(proper_round(5.0499999999,1))
5.0
>>> print(proper_round(1.499999999))
1.0
>>> print(proper_round(2.499999999))
2.0
>>> print(proper_round(3.499999999))
3.0
>>> print(proper_round(4.499999999))
4.0
>>> print(proper_round(5.499999999))
5.0
Finalmente, la respuesta corregida sería:
# Having proper_round defined as previously stated
h = int(proper_round(h))
EDITAR 3:
Pruebas:
>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1 # should be 7
El problema aquí es que el dec
enésimo decimal puede ser 9 y si el dec+1
enésimo dígito> = 5, el 9 se convertirá en un 0 y un 1 debería llevarse al dec-1
enésimo dígito.
Si tomamos esto en consideración, obtenemos:
def proper_round(num, dec=0):
num = str(num)[:str(num).index('.')+dec+2]
if num[-1]>='5':
a = num[:-2-(not dec)] # integer part
b = int(num[-2-(not dec)])+1 # decimal part
return float(a)+b**(-dec+1) if a and b == 10 else float(a+str(b))
return float(num[:-1])
En la situación descrita anteriormente b = 10
y la versión anterior sería simplemente concatenar a
y b
que daría lugar a una concatenación de 10
donde el 0 se arrastra desaparecería. Esta versión se transforma b
en el lugar decimal correcto basado en dec
, como un acarreo adecuado.
int(x)