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.
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. –
Merci - votre commentaire a piqué ma curiosité alors j'ai étendu ma réponse avec une variante qui utilise le module 'decimal'. –