L'arrondi est généralement effectué sur des nombres à virgule flottante, et il y a ici trois fonctions de base que vous devez connaître : round
(arrondi au nombre entier le plus proche), math.floor
(toujours arrondi à l'inférieur), et math.ceil
(toujours arrondis à l'unité supérieure).
Vous posez des questions sur les nombres entiers et l'arrondi à la centaine, mais nous pouvons toujours utiliser math.ceil
tant que vos chiffres sont inférieurs à 2 53 . Pour utiliser math.ceil
nous divisons d'abord par 100, nous arrondissons et nous multiplions ensuite par 100 :
>>> import math
>>> def roundup(x):
... return int(math.ceil(x / 100.0)) * 100
...
>>> roundup(100)
100
>>> roundup(101)
200
Le fait de diviser par 100 d'abord et de multiplier par 100 ensuite "décale" deux décimales vers la droite et la gauche, de sorte que math.ceil
fonctionne sur les centaines. Vous pouvez utiliser 10**n
au lieu de 100 si vous voulez arrondir aux dizaines ( n = 1
), des milliers ( n = 3
), etc.
Une autre façon de procéder consiste à éviter les nombres à virgule flottante (leur précision est limitée) et à utiliser uniquement des nombres entiers. Les nombres entiers ont une précision arbitraire en Python, ce qui vous permet d'arrondir des nombres de n'importe quelle taille. La règle d'arrondi est simple : trouvez le reste après la division par 100, et ajoutez 100 moins ce reste s'il est différent de zéro :
>>> def roundup(x):
... return x if x % 100 == 0 else x + 100 - x % 100
Cela fonctionne pour des nombres de toutes tailles :
>>> roundup(100)
100
>>> roundup(130)
200
>>> roundup(1234567891234567891)
1234567891234567900L
J'ai fait un mini-benchmark des deux solutions :
$ python -m timeit -s 'import math' -s 'x = 130' 'int(math.ceil(x/100.0)) * 100'
1000000 loops, best of 3: 0.364 usec per loop
$ python -m timeit -s 'x = 130' 'x if x % 100 == 0 else x + 100 - x % 100'
10000000 loops, best of 3: 0.162 usec per loop
La solution en nombres entiers purs est plus rapide d'un facteur deux par rapport à la solution en nombres entiers. math.ceil
solution.
Thomas a proposé une solution basée sur les nombres entiers qui est identique à celle que j'ai ci-dessus, sauf qu'elle utilise une astuce en multipliant les valeurs booléennes. Il est intéressant de voir qu'il n'y a pas d'avantage de vitesse à écrire le code de cette façon :
$ python -m timeit -s 'x = 130' 'x + 100*(x%100>0) - x%100'
10000000 loops, best of 3: 0.167 usec per loop
En guise de remarque finale, permettez-moi également de noter que si vous aviez voulu arrondir 101-149 à 100 et 150-199 à 200, par exemple, arrondir à l le plus proche cent, alors le système intégré round
peut le faire pour vous :
>>> int(round(130, -2))
100
>>> int(round(170, -2))
200
3 votes
Voulez-vous que 100 soit également arrondi à 200 ?
0 votes
Non, la réponse de Thomas fait exactement ce dont j'ai besoin.
1 votes
La réponse de Thomas fait arrondir 100 à 200. C'est pourquoi j'ai demandé.
0 votes
Vérifiez l'édition, je n'ai pas fait attention à cela dans la première réponse.
2 votes
@ofko : Vous avez accepté une réponse qui échoue avec les grands entiers ; voir ma réponse mise à jour pour les détails.