109 votes

Python arrondir un nombre entier à la centaine supérieure

Il semble que cette question ait déjà été posée des centaines de fois (les jeux de mots sont amusants =) mais je ne trouve que la fonction d'arrondi des flottants. Comment arrondir un nombre entier, par exemple : 130 -> 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é.

4voto

Sukrit Gupta Points 31

Essayez ça :

import math
def ceilm(number,multiple):
    '''Returns a float rounded up by a factor of the multiple specified'''
    return math.ceil(float(number)/multiple)*multiple

Exemple d'utilisation :

>>> ceilm(257,5)
260
>>> ceilm(260,5)
260

3voto

Thomas Orozco Points 15280

Si votre int est x : x + 100 - x % 100

Cependant, comme indiqué dans les commentaires, le résultat sera de 200 si x==100 .

Si ce n'est pas le comportement attendu, vous pouvez utiliser x + 100*(x%100>0) - x%100

0 votes

Cependant, si vous n'aimez pas les chiffres magiques, vous pouvez utiliser les autres solutions. Si vous êtes préoccupé par les performances, cette solution est toutefois plus rapide.

0 votes

Oui, 100 ne devrait pas être arrondi à l'unité supérieure, mais si cela rend la formule trop compliquée, je peux l'éviter en utilisant du code, pas de problème.

0 votes

Eh bien, l'autre version résout ce problème, car elle inclut la vérification avant d'ajouter 100 ! Si cela répond à votre besoin, n'oubliez pas d'accepter ! :)

3voto

epeleg Points 2346

Avertissement : Optimisations prématurées à venir...

Puisque tant de réponses ici font le timing de ceci, je voulais ajouter une autre alternative.

Prenant @Martin Geisler's

def roundup(x):
    return x if x % 100 == 0 else x + 100 - x % 100

(que je préfère pour plusieurs raisons)

mais en tenant compte du % d'action

def roundup2(x):
    x100= x % 100
    return x if x100 == 0 else x + 100 - x100

Amélioration de la vitesse d'environ 20 % par rapport à l'original.

def roundup3(x):
    x100 = x % 100
    return x if not x100 else x + 100 - x100

est encore meilleur et est ~36% plus rapide que l'original.

Finalement, je pensais que je pourrais laisser tomber le not et de changer l'ordre des branches en espérant que cela augmenterait également la vitesse, mais j'ai été déconcerté de découvrir qu'il est en fait plus lent et qu'il n'est plus que 23 % plus rapide que l'original.

def roundup4(x):
    x100 = x % 100
    return x + 100 - x100  if x100 else x

>python -m timeit -s "x = 130" "x if x % 100 == 0 else x + 100 - x % 100"
1000000 loops, best of 3: 0.359 usec per loop

>python -m timeit -s "x = 130" "x100 = x % 100"  "x if x100 == 0 else x + 100 - x100"
1000000 loops, best of 3: 0.287 usec per loop

>python -m timeit -s "x = 130" "x100 = x % 100"  "x if not x100 else x + 100 - x100"
1000000 loops, best of 3: 0.23 usec per loop

>python -m timeit -s "x = 130" "x100 = x % 100"  "x + 100 - x100 if x100 else x"
1000000 loops, best of 3: 0.277 usec per loop

Des explications sur la raison pour laquelle le 3 est plus rapide que le 4 seraient les bienvenues.

2voto

Riccardo Bucco Points 6478

Voici une solution très simple :

next_hundred = x//100*100+100

Comment cela fonctionne-t-il ?

  1. Effectuez la division entière par 100 (en fait, elle supprime la partie fractionnaire de la division normale). De cette façon, vous obtenez les dizaines d'un nombre. Par exemple : 243//100=2.
  2. Multipliez par 100, en obtenant le nombre original sans les dizaines et les unités. Par exemple : 2*100=200.
  3. Ajoutez 100 pour obtenir le résultat souhaité. Par exemple : 200+100=300

Quelques exemples

  • 0...99 arrondi à 100
  • 100...199 arrondi à 200
  • etc.

Une approche légèrement modifiée arrondit 1...100 à 100, 101...200 à 200, etc :

next_hundred = (x-1)//100*100+100

1voto

Harvey Points 407

Tout simplement :

round(599, -2)

donnera :

600

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X