int(round(x))
Arredondará e alterará para inteiro
EDITAR:
Você não está atribuindo int (round (h)) a nenhuma variável. Quando você chama int (round (h)), ele retorna o número inteiro, mas não faz mais nada; você precisa alterar essa linha para:
h = int(round(h))
Para atribuir o novo valor a h
EDIT 2:
Como o @plowman disse nos comentários, o Python round()
não funciona como seria de se esperar, e isso ocorre porque o modo como o número é armazenado como uma variável geralmente não é o que você vê na tela. Há muitas respostas que explicam esse comportamento:
round () não parece estar arredondando corretamente
Uma maneira de evitar esse problema é usar o decimal, conforme declarado por esta resposta: https://stackoverflow.com/a/15398691/4345659
Para que esta resposta funcione corretamente sem o uso de bibliotecas extras, seria conveniente usar uma função de arredondamento personalizada. Depois de muitas correções, eu vim com a seguinte solução, que, tanto quanto eu testei, evitava todos os problemas de armazenamento. É baseado no uso da representação de string, obtida com repr()
(NOT str()
!). Parece hacky, mas foi a única maneira que encontrei para resolver todos os casos. Funciona com o Python2 e o 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])
Testes:
>>> 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, a resposta corrigida seria:
# Having proper_round defined as previously stated
h = int(proper_round(h))
EDIT 3:
Testes:
>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1 # should be 7
O problema aqui é que o dec
décimo-decimal pode ser 9 e, se o dec+1
décimo-dígito> = 5, o 9 se tornará um 0 e um 1 deve ser carregado para o dec-1
-ésimo dígito.
Se levarmos isso em consideração, obtemos:
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])
Na situação descrita acima, b = 10
a versão anterior concatenaria a
e b
resultaria em uma concatenação de 10
onde o 0 à direita desapareceria. Esta versão se transforma b
na casa decimal correta com base em dec
, como um transporte adequado.
int(x)