web-dev-qa-db-fra.com

Arrondir à deux décimales dans Python 2.7?

Comment utiliser Python 2.7 pour arrondir mes nombres à deux décimales plutôt qu’à la dizaine donnée?

print "financial return of outcome 1 =","$"+str(out1)
78
RCN

Utilisez la fonction intégrée round() :

>>> round(1.2345,2)
1.23
>>> round(1.5145,2)
1.51
>>> round(1.679,2)
1.68

Ou fonction intégrée format() :

>>> format(1.2345, '.2f')
'1.23'
>>> format(1.679, '.2f')
'1.68'

Ou nouveau formatage de chaîne de style:

>>> "{:.2f}".format(1.2345)
'1.23
>>> "{:.2f}".format(1.679)
'1.68'

Ou formatage de chaîne de style ancien:

>>> "%.2f" % (1.679)
'1.68'

aide sur round:

>>> print round.__doc__
round(number[, ndigits]) -> floating point number

Round a number to a given precision in decimal digits (default 0 digits).
This always returns a floating point number.  Precision may be negative.
187
Ashwini Chaudhary

Puisque vous parlez de financial figures, vous NE voulez PAS utiliser une arithmétique en virgule flottante. Vous feriez mieux d'utiliser Decimal.

>>> from decimal import Decimal
>>> Decimal("33.505")
Decimal('33.505')

Formatage de la sortie texte avec format() de style nouveau (arrondi par défaut à la moitié):

>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.505")))
financial return of outcome 1 = 33.50
>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.515")))
financial return of outcome 1 = 33.52

Voir les différences d'arrondi dues à l'imprécision en virgule flottante:

>>> round(33.505, 2)
33.51
>>> round(Decimal("33.505"), 2)  # This converts back to float (wrong)
33.51
>>> Decimal(33.505)  # Don't init Decimal from floating-point
Decimal('33.50500000000000255795384873636066913604736328125')

Manière correcte d'arrondir les valeurs financières :

>>> Decimal("33.505").quantize(Decimal("0.01"))  # Half-even rounding by default
Decimal('33.50')

Il est également courant d’avoir d’autres arrondis dans différentes transactions:

>>> import decimal
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_DOWN)
Decimal('33.50')
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_UP)
Decimal('33.51')

N'oubliez pas que si vous simulez le rendement d'un rendement, vous devrez probablement arrondir à chaque période d'intérêt, car vous ne pouvez pas payer/recevoir des fractions de cent, ni recevoir d'intérêts sur des fractions de cent. Pour les simulations, il est assez courant d’utiliser une virgule flottante en raison d’incertitudes inhérentes, mais dans ce cas, rappelez-vous toujours que l’erreur est là. De ce fait, même les investissements à taux fixe peuvent différer légèrement des rendements pour cette raison.

40
Ronan Paixão

Vous pouvez aussi utiliser str.format() :

>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23
5
TerryA

Lorsque vous travaillez avec des centimes/des entiers. Vous rencontrerez un problème avec 115 (comme dans 1,15 $) et d’autres nombres.

J'avais une fonction qui convertirait un entier en un flottant.

...
return float(115 * 0.01)

Cela a fonctionné la plupart du temps mais parfois, il retournait quelque chose comme 1.1500000000000001.

J'ai donc changé de fonction pour revenir comme ça ...

...
return float(format(115 * 0.01, '.2f'))

et cela retournera 1.15. Pas '1.15' ou 1.1500000000000001 (retourne un float, pas une chaîne)

Je poste surtout ceci afin que je puisse me souvenir de ce que j'ai fait dans ce scénario puisqu'il s'agit du premier résultat dans Google. 

4
teewuane

Lorsque nous utilisons la fonction round (), elle ne donnera pas les valeurs correctes.

vous pouvez le vérifier en utilisant, round (2.735) et round (2.725)

veuillez utiliser 

import math
num = input('Enter a number')
print(math.ceil(num*100)/100)
2
Midhun M M

Le mieux, à mon avis, consiste à utiliser la fonction format () :

>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f'))
// Should print: financial return of outcome 1 = $ 752.60

Mais je dois dire: n'utilisez pas de rond ni de format lorsque vous travaillez avec des valeurs financières.

2
Thiago Santos
print "financial return of outcome 1 = $%.2f" % (out1)
1
John Doe

En arrondissant à la prochaine 0.05, je ferais ceci

def roundup(x):
    return round(int(math.ceil(x / 0.05)) * 0.05,2)
0
Lucas VL

Une solution assez simple consiste à convertir le flottant en chaîne en premier, à sélectionner la sous-chaîne des quatre premiers chiffres, puis à reconvertir la sous-chaîne en float . Par exemple:

>>> out1 = 1.2345
>>> out1 = float(str(out1)[0:4])
>>> out1

Peut-être pas très efficace mais simple et fonctionne :)

0
Shan Niz