2013-07-04 27 views
60

Mit Python 2.7 wie runde ich meine Zahlen auf zwei Dezimalstellen anstatt die 10 oder so gibt es?Rundung auf zwei Dezimalstellen in Python 2.7?

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

Dies könnte eine Dose Würmer sein. Speichern Sie Finanzdaten in einer Gleitkommavariablen und möchten diese nun abrunden? * Exakte * Rundung ist in den meisten Fällen nicht möglich. Je nachdem, was Sie gerade versuchen, können Sie Ganzzahlen oder Dezimalzahlen verwenden. –

+0

Informieren Sie sich über Formatspezifizierer. Sie können Float-Werte direkt ausgeben, ohne sie in Strings umzuwandeln. –

Antwort

161

Verwenden Sie die eingebaute Funktion round():

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

Oder eingebaute Funktion format():

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

oder eine neue Stil-String-Formatierung:

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

Or O ld Stil-String-Formatierung:

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

Hilfe auf 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. 
+2

Die Methode zum Formatieren von Zeichenfolgen ist nützlich, wenn Sie mit Dezimalen arbeiten. z. 'Dezimal (" {:. 2f} ". Format (val))' –

+0

@PatchRickWalsh Oder einfach 'Dezimal (Format (val, '.2f'))'. –

+9

Cool! Ich wusste nichts über das eingebaute Format. Nachdem ich mehr untersucht habe, denke ich, dass dies die genaueste Art der Rundung ist, wenn Gleitkommafehler absolut nicht akzeptabel sind: "Dezimal ('123.345'). Quantisieren (Dezimal ('1.00'), Runden = dezimal.ROUND_HALF_UP)' gibt Ihnen ' Dezimal ('123.35') '. Auf der anderen Seite gibt 'Decimal (Format (Dezimal ('123.345'), '.2f')) 'Dezimal (' 123.34 '), weil die Binärdarstellung von 123.345 weniger als 123.345 ist. –

1
print "financial return of outcome 1 = $%.2f" % (out1) 
5

Sie können str.format() verwenden, auch:

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

Bei der Arbeit mit ein paar Cent/Zahlen. Sie werden auf ein Problem mit 115 (wie in $ 1.15) und anderen Zahlen stoßen.

Ich hatte eine Funktion, die einen Integer in einen Float konvertieren würde.

... 
return float(115 * 0.01) 

Das meiste Zeit gearbeitet, aber manchmal wäre es so etwas wie 1.1500000000000001 zurück.

Also änderte ich meine Funktion wie diese zurückzukehren ...

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

und das wird 1.15 zurück. Nicht '1.15' oder 1.1500000000000001 (gibt einen Gleitkommawert zurück, keine Zeichenfolge)

Ich poste hauptsächlich dies, damit ich mich daran erinnern kann, was ich in diesem Szenario gemacht habe, da dies das erste Ergebnis in Google ist.

+0

Wie in einer anderen Antwort erwähnt, für Finanzdaten verwenden Dezimalzahlen, nicht schwebt. –

+1

Am Ende konvertierte ich fast alles zu ganzen Zahlen. Es scheint viel einfacher zu sein, damit zu arbeiten. Ich habe jedoch nichts gemacht, was mit Bruchteilen von Pennies zu tun hat. – teewuane

20

Da Sie über Finanz Zahlen sprechen, Sie NICHT wollen Gleitkomma-Arithmetik verwenden. Sie sind besser dran mit Dezimal.

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

Textausgabe mit neuem Stil Formatierung format() (Standardeinstellung Halb auch Rundung):

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

die Unterschiede Siehe aufgrund von Rundungsungenauigkeiten Gleitkommazahlen:

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

Richtiger Weg, um finanzielle Werte zu runden:

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

Es ist auch üblich, andere Arten haben in verschiedenen Transaktionen der Rundung:

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

Denken Sie daran, dass, wenn Sie Rückkehr Ergebnis sind simuliert, möglicherweise Sie bei jeder Zinsperiode zu Runde haben wird, da können Sie Bezahlen oder erhalten Sie keine Cent-Bruchteile, noch erhalten Sie Zinsen über Cent-Bruchteile. Bei Simulationen ist es üblich, Gleitkommazahlen aufgrund von inhärenten Unsicherheiten zu verwenden, aber denken Sie dabei immer daran, dass der Fehler vorhanden ist. Daher können sich auch festverzinsliche Anlagen dadurch etwas von den Renditen unterscheiden.

2

Das beste, denke ich, ist die format() Funktion zu verwenden:

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

Aber ich muss sagen: rund oder das Format nicht verwenden, wenn sie mit Finanzwerten arbeiten.

+0

'Format' erfordert Nicht-String für das Format f. Wenn nicht, hast du einen ValueError. Der richtige Code ist: 'format (out1, '2f ')' ohne Casting in String – danigosa

0

Eine ziemlich einfache Problemumgehung besteht darin, zuerst den Float in einen String zu konvertieren, dann den Teilstring der ersten vier Zahlen und schließlich den Teilstring wieder in float umzuwandeln. Zum Beispiel:

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

möglicherweise nicht sehr effizient, aber einfach und funktioniert :)

1

Wenn wir die Runde() Funktion verwenden, ist es nicht korrekte Werte geben wird.

Sie können es verwenden, rund (2.735) und rund (2.725)

benutzen Sie bitte

import math 
num = input('Enter a number') 
print(math.ceil(num*100)/100) 
+0

Bitte fügen Sie ein Beispiel, das Sie getestet haben, die Ergebnisse und was denken Sie ist falsch mit ihnen. –

+0

Import Mathe num = Eingabe ('Geben Sie eine Nummer ein') numr = float (rund (num, 2)) print num –

+0

siehe unten .. –

0

auf den nächsten 0,05 Aufrunden, würde ich auf diese Weise tun:

def roundup(x): 
    return round(int(math.ceil(x/0.05)) * 0.05,2) 
Verwandte Themen