int(round(x))
Va l'arrondir et le changer en entier
ÉDITER:
Vous n'affectez int (round (h)) à aucune variable. Lorsque vous appelez int (round (h)), il renvoie le nombre entier mais ne fait rien d'autre; vous devez changer cette ligne pour:
h = int(round(h))
Pour affecter la nouvelle valeur à h
EDIT 2:
Comme @plowman l'a dit dans les commentaires, Python round()ne fonctionne pas comme on pourrait s'y attendre normalement, et c'est parce que la façon dont le nombre est stocké sous forme de variable n'est généralement pas la façon dont vous le voyez à l'écran. Il existe de nombreuses réponses qui expliquent ce comportement:
round () ne semble pas arrondir correctement
Une façon d'éviter ce problème est d'utiliser la décimale comme indiqué par cette réponse: https://stackoverflow.com/a/15398691/4345659
Pour que cette réponse fonctionne correctement sans utiliser de bibliothèques supplémentaires, il serait pratique d'utiliser une fonction d'arrondi personnalisée. Après beaucoup de corrections, j'ai trouvé la solution suivante, qui autant que j'ai testé a évité tous les problèmes de stockage. Il est basé sur l'utilisation de la représentation sous forme de chaîne, obtenue avec repr()(NOT str()!). Cela a l'air hacky mais c'était la seule façon que j'ai trouvée pour résoudre tous les cas. Il fonctionne avec Python2 et 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])
Tests:
>>> 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
Enfin, la réponse corrigée serait:
# Having proper_round defined as previously stated
h = int(proper_round(h))
EDIT 3:
Tests:
>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1 # should be 7
Le problème ici est que la dec-ème décimale peut être 9 et si le dec+1-ème chiffre> = 5, le 9 deviendra un 0 et un 1 devrait être porté au dec-1-ème chiffre.
Si nous prenons cela en considération, nous obtenons:
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])
Dans la situation décrite ci-dessus b = 10et la version précédente ne ferait que concaténer aet bce qui entraînerait une concaténation de l' 10endroit où le 0 de fin disparaîtrait. Cette version se transforme bà la bonne décimale en fonction dec, comme un report approprié.
int(x)