2010-07-11 20 views
9

quando accetta l'input dell'utente con un decimale in Python sto usando:numero di cifre decimali che specificano in Python

#will input meal subtotal 
def input_meal(): 
    mealPrice = input('Enter the meal subtotal: $') 
    mealPrice = float (mealPrice) 
    return mealPrice 

che restituisce esattamente ciò che è entrato - diciamo $ 43.45
ma quando si utilizza tale valore per calcolare e tassa di visualizzazione sto usando:

#will calculate 6% tax 
def calc_tax(mealPrice): 
    tax = mealPrice*.06 
    return tax 

che restituisce una visualizzazione di $ 2.607 utilizzando

mealPrice = input_meal() 
tax = calc_tax(mealPrice) 
display_data(mealPrice, tax) 

Come posso invece impostarlo a $ 2,61?
Perdonami, mi rendo conto che questa è roba di base ma non la chiamano Intro per niente ...

Grazie!

+0

Janet, FYI, è necessaria una riga vuota prima delle sezioni del codice. O semplicemente evidenziali e fai clic sul pulsante '1010'. (Questa volta ho corretto la rientranza per te) – Stephen

risposta

2

non si mostra il codice per display_data, ma ecco cosa devi fare:

print "$%0.02f" %amount 

Questo è un format specifier per la variabile amount.

Poiché questo è l'argomento per principianti, non entrerò in floating point rounding error, ma è bene essere consapevoli che esiste.

+0

La migliore risposta qui, grazie! –

21

Ci sono alcuni modi per farlo a seconda di come si desidera mantenere il valore.

È possibile utilizzare la formattazione di base stringa, per esempio

'Your Meal Price is %.2f' % mealPrice 

È possibile modificare il 2 a tutto ciò che la precisione che vi serve.

Tuttavia, dal momento che hai a che fare con i soldi, dovresti esaminare il modulo decimal che ha un metodo interessante chiamato quantize che è esattamente per lavorare con le applicazioni monetarie. Si può usare in questo modo:

from decimal import Decimal, ROUND_DOWN 
mealPrice = Decimal(str(mealPrice)).quantize(Decimal('.01'), rounding=ROUND_DOWN) 

Nota che l'attributo è puramente facoltativa pure.

+1

''% .2f '% mealPrice' ha funzionato magnificamente! (Dovrò comunque esaminare ulteriormente il modulo decimale - non riuscivo a farlo funzionare) Grazie mille! – Janet

+1

+1 per il riferimento decimale; con i galleggianti, otterrete alcuni arrotondamenti sorprendenti (ad esempio, provate un prezzo del pasto di 0,25'). Ma non penso che la vostra linea decimale funzioni: provate 'quantize (Decimal ('0,01'))' invece di 'quantize ('. 01')'. –

+0

@Mark Grazie! hai ragione, non è così.Ho risolto il problema, in più aveva un errore di sintassi .. avrebbe dovuto testare il mio codice :) – Bartek

2

Per il calcolo delle imposte, è possibile utilizzare round (dopo tutto, è quello che il ristorante fa):

def calc_tax(mealPrice): 
    tax = round(mealPrice*.06,2) 
    return tax 

Per visualizzare i dati, è possibile utilizzare una stringa multi-linea, e il string format method:

def display_data(mealPrice, tax): 
    total=round(mealPrice+tax,2) 
    print('''\ 
Your Meal Price is {m:=5.2f} 
Tax    {x:=5.2f} 
Total    {t:=5.2f} 
'''.format(m=mealPrice,x=tax,t=total)) 

Nota il metodo di formattazione è stato introdotto in Python 2.6, per le versioni precedenti avrete bisogno di utilizzare vecchio stile stringa di interpolazione %:

print('''\ 
Your Meal Price is %5.2f 
Tax    %5.2f 
Total    %5.2f 
'''%(mealPrice,tax,total)) 

Poi

mealPrice=input_meal() 
tax=calc_tax(mealPrice) 
display_data(mealPrice,tax) 

rendimenti:

# Enter the meal subtotal: $43.45 
# Your Meal Price is 43.45 
# Tax     2.61 
# Total    46.06 
+0

Funziona perfettamente anche. Differisce significativamente da "Il tuo prezzo del pasto è% .2f '% mealPrice'? – Janet

+0

'% 5.2f' funzionerebbe allo stesso modo (vedi sopra). Ho iniziato a usare 'format' in preparazione per la porta su Python 3. Ma in questo caso, non ho fatto nulla con' format' che non può essere fatto con interpolazione di stringhe. – unutbu

7

Sono stupito per il secondo numero mi hai detto (e confermato dal tuo arrotondamento richiesto) - all'inizio pensavo che il mio istinto per l'aritmetica mentale stesse iniziando a fallire (I am invecchiando, dopo tutto, in modo che potrebbe andare allo stesso modo del mio ricordo un tempo nitido! -) ... ma poi ho confermato che non ha, ancora, usando, come immagino tu sia, Python 3.1, e copia e incolla ..:

>>> def input_meal(): 
...  mealPrice = input('Enter the meal subtotal: $') 
...  mealPrice = float (mealPrice) 
...  return mealPrice 
... 
>>> def calc_tax(mealPrice): 
...  tax = mealPrice*.06 
...  return tax 
... 
>>> m = input_meal() 
Enter the meal subtotal: $34.45 
>>> print(calc_tax(m)) 
2.067 
>>> 

... come previsto - ancora, si dice invece "restituisce un display di $ 2.607" ... che potrebbe essere un errore di battitura, semplicemente scambiando due cifre, ad eccezione quindi chiedi "Come posso impostarlo a $ 2,61?" quindi sembra davvero che tu intenda veramente 2.607 (che potrebbe essere arrotondato a 2,61 in vari modi) e sicuramente non il risultato aritmetico corretto, 2.067 (che al massimo potrebbe essere arrotondato a 2,07 ... sicuramente non a 2,61 come richiesto) .

Immagino che per prima cosa si sia verificato l'errore nella trascrizione, quindi ho calcolato mentalmente l'arrotondamento desiderato dal valore falsificato per numero 2.607 anziché dal risultato originale effettivo. È questo che è successo? ! Di sicuro è riuscito a mi confondono per un po '-)

In ogni caso, per arrotondare un galleggiante a due cifre decimali, approccio più semplice è la funzione built-in round con un secondo argomento di 2:

>>> round(2.067, 2) 
2.07 
>>> round(2.607, 2) 
2.61 

per i numeri esattamente equidistanti tra due possibilità, arrotonda-to-even:

>>> round(2.605, 2) 
2.6 
>>> round(2.615, 2) 
2.62 

o, come la documentazione messo (esemplificando con la forma a singolo argomento di round, che arrotonda al più vicino in Teger):

se due multipli sono ugualmente vicini, l'arrotondamento avviene verso il anche scelta (così, ad esempio, sia rotondo (0,5) e rotondo (-0,5) sono 0, e rotondo (1.5) è 2).

Tuttavia, per i calcoli sul denaro, I secondo la raccomandazione, già dato in altre risposte, per restare con quello che le offerte decimal modulo, invece di float numeri.

+0

Solo un nitpick: grazie ai soliti problemi di binario in virgola mobile, '2.605' e' 2.615' non sono esattamente equidistanti tra due possibilità; quindi è davvero probabile che i tuoi esempi rotondi sembrino dare un risultato 'round-half-to-even'. 'round (2.635, 2)' dà '2.63', per esempio. IOW, I * terzo * il suggerimento di provare il modulo decimale se è importante ottenere la direzione di arrotondamento giusta per i casi a metà strada. :) BTW, in Python 2.x, 'round' continua a girare a metà strada a partire da zero, piuttosto che a pari. –

Problemi correlati