Rundung auf zwei Dezimalstellen in Python 2.7?

82

Wie runde ich mit Python 2.7 meine Zahlen auf zwei Dezimalstellen anstatt auf die 10 oder so?

print "financial return of outcome 1 =","$"+str(out1)
RCN
quelle
2
Dies könnte eine Dose Würmer sein. Speichern Sie Finanzdaten in einer Gleitkommavariablen und möchten diese nun abrunden? Eine genaue Rundung ist in den meisten Fällen nicht möglich. DecimalJe nachdem, was Sie tatsächlich versuchen, möchten Sie möglicherweise Ganzzahlen oder s verwenden.
Tim Pietzcker
Erfahren Sie mehr über Formatspezifizierer. Sie können Float-Werte direkt drucken, ohne sie in Zeichenfolgen zu konvertieren.
John Doe

Antworten:

196

Verwenden Sie die integrierte 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 neue Formatierung von Zeichenfolgen:

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

Oder alte Formatierung von Zeichenfolgen:

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

Hilfe zu 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.
Ashwini Chaudhary
quelle
2
Die Formatierungsmethode für Zeichenfolgen ist nützlich, wenn Sie mit Dezimalstellen arbeiten. ZBDecimal("{:.2f}".format(val))
Patch Rick Walsh
@PatchRickWalsh Oder einfach Decimal(format(val, '.2f')).
Ashwini Chaudhary
9
Cool! Ich wusste nichts über dieses eingebaute Format. Nachdem ich mehr untersucht habe, denke ich, dass dies die genaueste Art der Rundung ist, wenn Gleitkommafehler absolut nicht akzeptabel sind: Decimal('123.345').quantize(Decimal('1.00'), rounding=decimal.ROUND_HALF_UP)gibt Ihnen Decimal('123.35'). Auf der anderen Seite Decimal(format(Decimal('123.345'), '.2f'))gibt Ihnen, Decimal('123.34')weil die binäre Darstellung von 123.345 kleiner als 123.345 ist.
Patch Rick Walsh
47

Da Sie sprechen Finanz- Zahlen, Sie wollen nicht Gleitkommaarithmetik verwenden. Sie sind besser dran, wenn Sie Decimal verwenden.

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

Formatierung der Textausgabe im neuen Stil format()(standardmäßig halbrunde 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

Sehen Sie die Unterschiede in der Rundung aufgrund von Gleitkomma-Ungenauigkeiten:

>>> 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 Rundungsarten bei verschiedenen Transaktionen zu verwenden:

>>> 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 Sie, wenn Sie das Renditeergebnis simulieren, möglicherweise in jeder Zinsperiode runden müssen, da Sie keine Cent-Brüche zahlen / erhalten oder Zinsen über Cent-Brüche erhalten können. Für Simulationen ist es aufgrund von inhärenten Unsicherheiten üblich, nur Gleitkommazahlen zu verwenden. Denken Sie dabei jedoch immer daran, dass der Fehler vorliegt. Daher können sich selbst festverzinsliche Anlagen aus diesem Grund geringfügig in der Rendite unterscheiden.

Ronan Paixão
quelle
5

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

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

Bei der Arbeit mit Pennies / Integer. Sie werden auf ein Problem mit 115 (wie in 1,15 $) und anderen Zahlen stoßen.

Ich hatte eine Funktion, die eine Ganzzahl in ein Float konvertieren würde.

...
return float(115 * 0.01)

Das hat die meiste Zeit funktioniert, aber manchmal hat es so etwas zurückgegeben 1.1500000000000001.

Also habe ich meine Funktion geändert, um so zurückzukehren ...

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

und das wird zurückkehren 1.15. Nicht '1.15'oder 1.1500000000000001(gibt einen Float zurück, keinen String)

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

teewuane
quelle
Wie in einer anderen Antwort ausgeführt, verwenden Sie für Finanzdaten Dezimalzahlen, keine Gleitkommazahlen.
Bruno Le Floch
1
Am Ende habe ich fast alles in ganze Zahlen umgewandelt. Es scheint viel einfacher zu sein, damit zu arbeiten. Ich habe jedoch nichts getan, was mit Bruchteilen von Pennys zu tun hat.
Teewuane
2

Ich denke, das Beste 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: Verwenden Sie keine Runden oder Formate, wenn Sie mit finanziellen Werten arbeiten.

Thiago Santos
quelle
formaterfordert keine Zeichenfolge für das f-Format. Wenn nicht, haben Sie einen ValueError. Der richtige Code ist: format(out1, '.2f')ohne Casting auf String
Danius
2

Wenn wir die Funktion round () verwenden, werden keine korrekten Werte angegeben.

Sie können es mit rund (2.735) und rund (2.725) überprüfen.

benutzen Sie bitte

import math
num = input('Enter a number')
print(math.ceil(num*100)/100)
Midhun MM
quelle
Bitte fügen Sie ein Beispiel hinzu, das Sie getestet haben, die Ergebnisse und was Ihrer Meinung nach daran falsch ist.
Liran Funaro
Import Mathe num = Eingabe ('Zahl eingeben') numr = float (rund (num, 2)) print numr
Midhun MM
1
print "financial return of outcome 1 = $%.2f" % (out1)
John Doe
quelle
0

Eine ziemlich einfache Problemumgehung besteht darin, den Float zuerst in einen String umzuwandeln, den Teilstring der ersten vier Zahlen auszuwählen und schließlich den Teilstring wieder in float umzuwandeln. Beispielsweise:

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

Kann nicht super effizient sein, aber einfach und funktioniert :)

Shan Niz
quelle
2
Diese Methode ist sehr unzuverlässig. Wenn Ihr Wert mehr als eine Ziffer vor dem Dezimalpunkt hat, erhalten Sie nicht die beiden gewünschten Dezimalstellen. Gleiches Problem mit einer negativen Zahl.
André Kuhlmann
0

Auf die nächsten 0,05 aufrunden, würde ich folgendermaßen vorgehen:

def roundup(x):
    return round(int(math.ceil(x / 0.05)) * 0.05,2)
Lucas VL
quelle