2010-10-21 7 views
7

J'ai un tas de chars et je veux les arrondir au prochain multiple de 10.comment arrondir plus lieu de 10 en python

Par exemple:

10.2 should be 20 
10.0 should be 10 
16.7 should be 20 
94.9 should be 100 

Je ne ai besoin pour aller de 0 à 100. J'ai essayé math.ceil() mais cela arrondit à l'entier le plus proche.

Merci d'avance.

Répondre

12
from math import ceil 

def ceil_to_tens(x): 
    return int(ceil(x/10.0)) * 10 

Modifier: D'accord, maintenant que j'ai un imméritée badge « Nice réponse » pour cette réponse, je pense dois la communauté avec une solution appropriée à l'aide du module decimal qui ne souffre pas de ces problèmes :) Merci à Jeff de l'avoir signalé. Ainsi, une solution utilisant decimal fonctionne comme suit:

from decimal import Decimal, ROUND_UP 

def ceil_to_tens_decimal(x): 
    return (Decimal(x)/10).quantize(1, rounding=ROUND_UP) * 10 

Bien sûr, le code ci-dessus nécessite x être un entier, une chaîne ou un objet Decimal - flotteurs ne fonctionnera pas car cela irait à l'encontre tout le but de l'utilisation le module decimal.

Il est dommage que Decimal.quantize ne fonctionne pas correctement avec des nombres supérieurs à 1, cela aurait sauvé l'astuce de division-multiplication.

+1

Vous devez être très prudent avec le point flottant ici. Vous pensez que x vaut 10.0, mais en réalité c'est 10.000 ... 000132 et vous obtenez une réponse à laquelle vous ne vous attendez pas. Vous pourriez être mieux avec l'arithmétique de point fixe ou décimal. –

+0

Merci - votre commentaire a piqué ma curiosité alors j'ai étendu ma réponse avec une variante qui utilise le module 'decimal'. –

3
>>> x = 16.7 
>>> int(10 * math.ceil(x/10.0)) 
1

Les réponses ici sont lourdes de péril. Par exemple 11*1.1 - 2.1 = 10.0, n'est-ce pas? Mais attendez:

>>> x = 11*1.1 - 2.1 
>>> int(ceil(x/10.0)) * 10 
20 
>>> x 
10.000000000000002 
>>> 

Vous pouvez essayer cette

int(ceil(round(x, 12)/10.0)) * 10 

Mais choisir le nombre de décimales à arrondir est vraiment difficile, car il est difficile de prédire comment le bruit du point Floating accumule. S'il est vraiment important d'obtenir ce droit tout le temps, alors vous devez utiliser l'arithmétique à virgule fixe ou décimal.

+0

Curieusement, 'str (11 * 1.1-2.1)' donne '' 10 .0'', ce qui suggère une autre solution, certes très laide: 'int (ceil (float (str (x))/10)) * 10'. –

+0

Je crois que str() tourne à 10 places. –

0

Si vous êtes à la recherche d'une autre solution qui n'implique pas la division flottante, voici celui qui utilise le module:

def ceil_to_tens_mod(x): 
    tmp = int(ceil(x)) 
    mod10 = tmp % 10 
    return tmp - mod10 + (10 if mod10 else 0) 

Il y a probablement un moyen de simplifier, mais vous allez.