2010-10-12 8 views

risposta

24

Da del Python cheat sheet The Floating-Point Guida:

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

Utilizzando round() è la cosa sbagliata da fare, perché i galleggianti sono binary fractions che non può rappresentare cifre decimali con precisione.

Se è necessario eseguire calcoli con cifre decimali, utilizzare il tipo Decimal nel modulo decimal.

+0

Supponendo che sia necessario memorizzare quel risultato per un uso futuro, sarebbe qualcosa come x = "%.2f "funziona, o come usi ancora quei dati, piuttosto che semplicemente stampandoli (come ho visto gli altri qui sotto usano la funzione di stampa) EDIT: probabilmente dovrei semplicemente seguire il tuo link, mi dispiace EDIT di nuovo, scusa ancora non sono sicuro di come la domanda originale che ho chiesto funziona con quella sintassi. +1 come il tuo modo di essere a posto! – onaclov2000

+0

@ onaclov2000: come ho scritto: se hai bisogno di lavorare con i dati decimali, dovresti usare un tipo di dati decimali invece di float. –

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

Da: Python Docs round (x [, n]) Restituisce il valore in virgola mobile x Ha arrotondati su n cifre dopo il punto decimale. Se n è omesso, il valore predefinito è zero. Il risultato è un numero in virgola mobile. I valori sono arrotondati al multiplo più vicino di 10 al minimo della potenza n; se due multipli sono ugualmente vicini, l'arrotondamento viene eliminato da 0 (ad esempio, round (0,5) è 1.0 e round (-0.5) è -1.0).

Nota Il comportamento di round() per i float può essere sorprendente: ad esempio, round (2.675, 2) restituisce 2,67 anziché il previsto 2,68. Questo non è un bug: è il risultato del fatto che la maggior parte delle frazioni decimali non può essere rappresentata esattamente come un float. Vedi Aritmetica in virgola mobile: problemi e limitazioni per ulteriori informazioni.

Sembra round (293,466 .... [2]) lo farebbe,

+1

@Shane: no, in realtà non lo è. –

1

x = round(293.4662543, 2)

13

Se volete un numero, utilizzare la funzione round():

>>> round(12.3456, 2) 
12.35 

(ma +1 per la risposta di Michael re. il tipo Decimal.)

Se si desidera una stringa:

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

Se avete bisogno di numeri come 2.3K o 12M, questa funzione fa il lavoro:

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') 

Risultati:

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

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

Spero che questo vi aiuterà.

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)) 

Risultato:

189.75