2010-07-11 19 views
9

Wenn in Python mit einer Kommabenutzereingabe akzeptieren:Anzahl der Dezimalstellen in Python Angeben

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

die genau gibt, was eingegeben wird - sagen $ 43.45
aber wenn Sie diesen Wert mit zu berechnen und Anzeigesteuer ich verwende:

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

, die eine Anzeige von $ gibt 2.607 mit

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

Wie kann ich das stattdessen auf $ 2.61 setzen?
Verzeihen Sie mir, ich realisiere, das ist grundlegende Sachen, aber sie nennen es nicht Intro für nichts ...

Vielen Dank!

+0

Janet, FYI, Sie brauchen eine leere Zeile vor Ihren Code-Abschnitten. Oder markieren Sie sie einfach und klicken Sie auf die Schaltfläche "1010". (Dieses Mal habe ich den Einzug für Sie behoben) – Stephen

Antwort

2

Sie zeigen nicht den Code für display_data, aber hier ist, was Sie tun müssen:

print "$%0.02f" %amount 

Dies ist ein format specifier für die Variable amount.

Da dies Anfänger Thema ist, werde ich nicht in floating point rounding error, aber es ist gut zu wissen, dass es existiert.

+0

Beste Antwort hier, danke! –

21

Je nachdem, wie Sie den Wert beibehalten möchten, gibt es mehrere Möglichkeiten.

Sie grundlegende Zeichenfolge Formatierung verwenden können, z

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

Sie können die 2 ändern, was auch immer Präzision Sie benötigen.

Da Sie jedoch mit Geld beschäftigen, sollten Sie in das Modul decimal schauen, das eine coole Methode namens quantize hat, die genau für die Arbeit mit monetären Anwendungen ist. Sie können es wie so verwenden:

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

Beachten Sie, dass die Attribut als auch rein optional.

+1

''% .2f '% mealPrice' hat wunderbar funktioniert! (Ich muss jedoch weiter in das Dezimal-Modul schauen - es konnte nicht funktionieren) Vielen Dank! – Janet

+1

+1 für die Dezimalreferenz; Mit Floats erhalten Sie einige überraschende Rundungen (z. B. versuchen Sie einen Essenspreis von 0,25). Aber ich glaube nicht, dass Ihre Dezimalzahl funktioniert: versuchen Sie 'quantisieren (Dezimal ('0.01'))' anstelle von 'quantisieren ('. 01')'. –

+0

@Mark Vielen Dank! Du hast recht, das tut es nicht.Ich reparierte es, plus es hatte einen Syntaxfehler .. sollte meinen Code geprüft haben :) – Bartek

2

Um Steuern zu berechnen, könnten Sie round verwenden (nachdem alle, das ist, was das Restaurant der Fall ist):

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

die Daten anzuzeigen, Sie eine mehrzeilige Zeichenfolge verwenden können, und die 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)) 

Beachten Sie, dass die Formatmethode in Python 2 eingeführt wurde.6, die für frühere Versionen müssen Sie im alten Stil String Interpolation % verwenden:

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

Dann

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

ergibt:

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

funktioniert auch tadellos. Unterscheidet sich das erheblich von 'Ihr Mahlzeitenpreis ist% .2f'% mealPrice '? – Janet

+0

'% 5.2f' würde auf die gleiche Weise funktionieren (siehe oben). Ich habe begonnen, 'format' zu verwenden, um den Port auf Python 3 vorzubereiten. Aber für diesen Fall habe ich nichts mit' format' gemacht, das nicht mit String-Interpolation gemacht werden kann. – unutbu

7

Ich bin erstaunt über die zweite Reihe Sie erwähnen (und bestätigen durch Ihre geforderte Rundung) - zuerst dachte ich, mein Instinkt für Kopfrechnen würde mich im Stich lassen (I am wird schließlich älter, so dass es genauso gehen könnte wie meine einst so scharfe Erinnerung! -) ... aber dann habe ich bestätigt, dass es noch nicht funktioniert, indem ich Python 3.1 benutze, wie ich es dir vorstelle, und das Kopieren und Einfügen ..:

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

... wie erwartet - doch, Sie sagen, dass es statt „gibt eine Anzeige von $ 2.607“ ... die ein Tippfehler sein könnten, nur zwei Ziffern tauschen, außer dass du dann fragst "Wie kann ich das stattdessen auf $ 2.61 setzen?" so scheint es wirklich Sie wirklich 2.607 (die auf 2,61 auf verschiedene Arten gerundet werden könnte) und definitiv nicht das arithmetisch korrekte Ergebnis, 2.067 (die bestenfalls auf 2,07 abgerundet werden kann ... definitiv nicht bis 2,61 wie Sie anfordern) .

Ich stelle mir vor, Sie hatten zuerst den Tippfehler in der Transkription auftreten, und dann mental berechnet die gewünschte Rundung aus der Falsified-by-Typo 2.607 und nicht das eigentliche ursprüngliche Ergebnis - ist das passiert? ! Es gelang mir sicher, für eine Weile zu verwirren -)

, Wie auch immer einen Schwimmer auf zwei Dezimalstellen zu runden, einfachste Ansatz ist die integrierte Funktion round mit einem zweiten Argument von 2:

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

für Zahlen exakt im gleichen Abstand zwischen zwei Möglichkeiten, es rundet-to-even:

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

oder, wie die docs legte es (mit der einzigen Argumente Form round Ausführungs, die auf den nächsten runden in Teger):

wenn zwei Vielfachen gleich nahe sind, wird in Richtung auf die Rundungs ​​ sogar Wahl gemacht (so zum Beispiel sowohl round (0,5) und runde (-0,5) ist 0, und round (1,5) ist 2).

jedoch für Berechnungen auf Geld, Ich zweite Empfehlung, die bereits in anderen Antworten gegeben, um mit dem, was die decimal Modul bieten, statt float Zahlen.

+0

Nur ein Nitpick: Dank der üblichen binären Fließkomma-Probleme sind '2.605' und' 2.615' nicht genau äquidistant zwischen zwei Möglichkeiten; Es ist also nur eine reine Chance, dass Ihre runden Beispiele aussehen, als würden sie ein "rundes halbes bis gleichmäßiges" Ergebnis erzielen. 'round (2.635, 2)' ergibt zum Beispiel '2.63'. IOW, ich * dritte * der Vorschlag, das Dezimal-Modul zu versuchen, wenn die Rundungsrichtung für die Hälfte der Fälle richtig ist, ist wichtig. :) BTW, in Python 2.x, runden Runde noch halbwegs Fälle von Null weg, anstatt zu gerade. –

Verwandte Themen