Existe-t-il une fonction intégrée qui peut arrondir comme suit?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
Je ne connais pas de fonction standard en Python, mais cela fonctionne pour moi:
def myround(x, base=5):
return int(base * round(float(x)/base))
def myround(x, base=5):
return base * round(x/base)
Il est facile de voir pourquoi ce qui précède fonctionne. Vous voulez vous assurer que votre nombre divisé par 5 est un entier correctement arrondi. Donc, nous faisons d'abord exactement cela ( round(float(x)/5)
où float
c'est seulement nécessaire dans Python2), puis puisque nous avons divisé par 5, nous multiplions également par 5. La conversion finale en int
est parce que round()
renvoie une valeur à virgule flottante dans Python 2.
J'ai rendu la fonction plus générique en lui donnant un base
paramètre, par défaut à 5.
x // base * base
floor()
etceil()
plutôt que lancer:base * floor(x/base)
math.floor
etmath.ceil
n'autorise pas l'utilisation avec une base personnalisée, donc la préférence n'est pas pertinente.Pour arrondir à des valeurs non entières, telles que 0,05:
J'ai trouvé cela utile car je pouvais simplement faire une recherche et remplacer dans mon code pour changer "round (" en "myround (", sans avoir à changer les valeurs des paramètres.
la source
def my_round(x, prec=2, base=0.05): return (base * (np.array(x) / base).round()).round(prec)
qui accepte également les tableaux numpy.C'est juste une question de mise à l'échelle
la source
Supprimer le «reste» fonctionnerait:
Si la valeur est déjà un entier:
En tant que fonction:
la source
la source
round (x [, n]): les valeurs sont arrondies au multiple de 10 le plus proche de la puissance moins n. Donc si n est négatif ...
Puisque 10 = 5 * 2, vous pouvez utiliser la division entière et la multiplication avec 2, plutôt que la division flottante et la multiplication avec 5,0. Pas que cela compte beaucoup, à moins que vous n'aimiez un peu changer
la source
Désolé, je voulais commenter la réponse d'Alok Singhai, mais cela ne me le permettra pas en raison d'un manque de réputation = /
Quoi qu'il en soit, nous pouvons généraliser une étape de plus et aller:
Cela nous permet d'utiliser des bases non entières, comme
.25
ou toute autre base fractionnaire.la source
Version modifiée de divround :-)
la source
Utilisation:
Il n'utilise pas de multiplication et ne convertira pas de / en flottants.
Arrondir au multiple de 10 le plus proche:
Comme vous pouvez le voir, cela fonctionne pour les nombres négatifs et positifs. Les égalités (par exemple -15 et 15) seront toujours arrondies vers le haut.
Un exemple similaire arrondi au multiple de 5 le plus proche, démontrant qu'il se comporte également comme prévu pour une "base" différente:
la source
Si quelqu'un a besoin d'un «arrondi financier» (0,5 arrondi toujours supérieur):
Selon la documentation, les autres options d'arrondi sont:
Par défaut, Python utilise ROUND_HALF_EVEN car il présente certains avantages statistiques (les résultats arrondis ne sont pas biaisés).
la source
Pour les entiers et avec Python 3:
Produire:
la source
Et ça:
la source
Multiple suivant de 5
Considérez que 51 doit être converti en 55:
la source
Voici mon code C. Si je comprends bien, ça devrait être quelque chose comme ça;
et ceci arrondit également au multiple de 5 le plus proche au lieu de simplement arrondir;
la source
Une autre façon de faire cela (sans multiplication explicite ou opérateurs de division):
la source
Vous pouvez «tromper»
int()
pour arrondir au lieu d'arrondir vers le bas en ajoutant0.5
au nombre auquel vous passezint()
.la source