web-dev-qa-db-fra.com

Arrondir un nombre à Python mais en gardant les zéros de fin

J'ai travaillé sur un script qui prend les données d'une feuille de calcul Excel, arrondit les nombres et supprime la virgule décimale, par exemple, 2606.89579999999 devient 26069. Cependant, j'ai besoin que le nombre soit arrondi à deux décimales même s'il y aurait un zéro arrière, donc 2606.89579999999 devrait devenir 260690.

Je l'ai actuellement, donc i prend les données de la cellule dans Excel et les arrondit à deux décimales (i = round(i, 2)), ce qui me donne la virgule décimale unique dans l'exemple ci-dessus.

J'ai essayé de comprendre comment faire fonctionner cela avec Decimal, mais je n'arrive pas à le faire fonctionner.

Tous les autres nombres qui sont arrondis, si la valeur arrondie ne se termine pas par '0', fonctionnent correctement avec round(i, 2), mais si les nombres se terminent juste par * .x0, ce 0 est supprimé et salit les données.

27
Seth Koberg

Comme vous parlez de zéros de fin, c'est une question de représentation sous forme de chaîne, vous pouvez utiliser

>>> "%.2f" % round(2606.89579999999, 2)
'2606.90'

Ou utilisez un style moderne avec la fonction format:

>>> '{:.2f}'.format(round(2606.89579999999, 2))
'2606.90'

et supprimez le point avec replace ou translate (_ fait référence au résultat de la commande précédente dans python):

>>> _.translate(None, '.')
'260690'

Notez que l'arrondi n'est pas nécessaire ici, car .2f le format applique le même arrondi:

>>> "%.2f" % 2606.89579999999
'2606.90'

Mais comme vous l'avez mentionné Excel, vous opteriez probablement pour rouler votre propre fonction d'arrondi, ou utiliser décimal , comme float.round peut conduire à des résultats étranges en raison de la représentation flottante:

>>> round(2.675, 2)
2.67
>>> round(2606.89579999999, 2)
2606.89

Avec une utilisation décimale quantifier :

>>> from decimal import *
>>> x = Decimal('2606.8950000000001')
# Decimal('2606.8950000000001')
>>> '{}'.format(x.quantize(Decimal('.01'), rounding=ROUND_HALF_EVEN))
'2606.90'

Cela, pour votre tâche d'origine, devient:

>>> x = Decimal('2606.8950000000001')
>>> int((x*100).quantize(1, rounding=ROUND_HALF_EVEN))
260690

Et la raison de l'arrondissement étrange vient au premier plan avec Decimal:

>>> x = Decimal(2606.8950000000001)
# Decimal('2606.89499999999998181010596454143524169921875') # internal float repr
33
alko
>>> '{:.2f}'.format(2606.89579999999).replace('.', '')
'260690'
3
Maciej Gol