2010-10-12 3 views

Répondre

24

à partir du guide-virgule flottante de Python cheat sheet:

"%.2f" % 1.2399 # returns "1.24" 
"%.3f" % 1.2399 # returns "1.240" 
"%.2f" % 1.2 # returns "1.20" 

En utilisant round() est la mauvaise chose à faire, parce que les flotteurs sont binary fractions qui ne peut pas représenter chiffres décimaux avec précision.

Si vous devez effectuer des calculs avec des chiffres décimaux, utilisez le type Decimal dans le module decimal.

+0

Supposons que vous ayez besoin de stocker ce résultat pour un usage futur. Quelque chose comme x = "%.2f "travail, ou comment utilisez-vous encore ces données, plutôt que de simplement l'imprimer (comme j'en ai vu d'autres ci-dessous utiliser la fonction d'impression) EDIT: Je devrais probablement suivre votre lien, désolé. la question initiale que j'ai posée fonctionne avec cette syntaxe +1 comme votre chemin semble bon! – onaclov2000

+0

@ onaclov2000: comme je l'ai écrit: si vous avez besoin de travailler avec des données décimales, vous devriez utiliser un type de données décimal au lieu de float. –

2
>>> print "%.2f" % 293.44612345 
293.45 
5

De: Python Docs round (x [n]) Renvoie la valeur en virgule flottante x arrondi à n chiffres après la virgule décimale. Si n est omis, il vaut par défaut zéro. Le résultat est un nombre à virgule flottante. Les valeurs sont arrondies au multiple le plus proche de 10 à la puissance moins n; si deux multiples sont également proches, l'arrondi est fait à partir de 0 (par exemple, arrondi (0.5) vaut 1.0 et arrondi (-0.5) vaut -1.0).

Remarque Le comportement de round() pour les flottants peut être surprenant: par exemple, round (2.675, 2) donne 2.67 au lieu de 2.68 attendu. Ce n'est pas un bug: c'est dû au fait que la plupart des fractions décimales ne peuvent pas être représentées exactement comme un flottant. Voir Arithmétique en virgule flottante: Problèmes et limitations pour plus d'informations.

Ressemble tour (293,466 .... [2]) serait le faire,

+1

@Shane: non, ce n'est vraiment pas le cas. –

1

x = round(293.4662543, 2)

13

Si vous voulez un numéro, utilisez la fonction round():

>>> round(12.3456, 2) 
12.35 

(mais +1 pour la réponse de Michael concernant le type Decimal.)

Si vous voulez une chaîne:

>>> print "%.2f" % 12.34567 
12.35 
0

Si vous avez besoin des chiffres comme 2.3K ou 12M, cette fonction fait le travail:

def get_shortened_integer(number_to_shorten): 
    """ Takes integer and returns a formatted string """ 
    trailing_zeros = floor(log10(abs(number_to_shorten))) 
    if trailing_zeros < 3: 
     # Ignore everything below 1000 
     return trailing_zeros 
    elif 3 <= trailing_zeros <= 5: 
     # Truncate thousands, e.g. 1.3k 
     return str(round(number_to_shorten/(10**3), 1)) + 'k' 
    elif 6 <= trailing_zeros <= 8: 
     # Truncate millions like 3.2M 
     return str(round(number_to_shorten/(10**6), 1)) + 'M' 
    else: 
     raise ValueError('Values larger or equal to a billion not supported') 

Résultats:

>>> get_shortened_integer(2300) 
2.3k # <-- str 

>>> get_shortened_integer(1300000) 
1.3M # <-- str 
0

J'espère que cela vous aidera.

def do(*args): 
    formattedList = [float("{:.2f}".format(num)) for num in args] 
    _result =(sum(formattedList)) 
    result = round(_result,2) 
    return result 


print(do(23.2332,45.24567,67,54.27)) 

Résultat:

189.75