Antworten:
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.
Decimal("{:.2f}".format(val))
Decimal(format(val, '.2f'))
.
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.
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.
Sie können auch verwenden str.format()
:
>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23
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.
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.
format
erfordert keine Zeichenfolge für das f-Format. Wenn nicht, haben Sie einen ValueError. Der richtige Code ist: format(out1, '.2f')
ohne Casting auf String
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)
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 :)
Decimal
Je nachdem, was Sie tatsächlich versuchen, möchten Sie möglicherweise Ganzzahlen oder s verwenden.