Ich weiß, dass Fragen zum Runden in Python bereits mehrmals gestellt wurden, aber die Antworten haben mir nicht geholfen. Ich suche nach einer Methode, die eine Float-Nummer halbiert und eine Float-Nummer zurückgibt. Die Methode sollte auch einen Parameter akzeptieren, der die Dezimalstelle definiert, auf die gerundet werden soll. Ich habe eine Methode geschrieben, die diese Art der Rundung implementiert. Ich denke jedoch, dass es überhaupt nicht elegant aussieht.
def round_half_up(number, dec_places):
s = str(number)
d = decimal.Decimal(s).quantize(
decimal.Decimal(10) ** -dec_places,
rounding=decimal.ROUND_HALF_UP)
return float(d)
Ich mag es nicht, dass ich float in einen String konvertieren muss (um Gleitkomma-Ungenauigkeiten zu vermeiden) und dann mit dem Dezimalmodul arbeiten muss . Haben Sie bessere Lösungen?
Bearbeiten: Wie in den Antworten unten ausgeführt, ist die Lösung meines Problems nicht so offensichtlich, da eine korrekte Rundung in erster Linie die korrekte Darstellung von Zahlen erfordert und dies bei float nicht der Fall ist. Also ich würde erwarten, dass der folgende Code
def round_half_up(number, dec_places):
d = decimal.Decimal(number).quantize(
decimal.Decimal(10) ** -dec_places,
rounding=decimal.ROUND_HALF_UP)
return float(d)
(das unterscheidet sich vom obigen Code nur dadurch, dass die Gleitkommazahl direkt in eine Dezimalzahl und nicht zuerst in eine Zeichenfolge konvertiert wird), um 2.18 zurückzugeben, wenn es so verwendet wird: round_half_up(2.175, 2)
Aber es wird nicht Decimal(2.175)
zurückgegeben Decimal('2.17499999999999982236431605997495353221893310546875')
, wie der Gleitkommawert Nummer wird vom Computer dargestellt. Überraschenderweise gibt der erste Code 2.18 zurück, da die Gleitkommazahl zuerst in einen String konvertiert wird. Es scheint, dass die Funktion str () eine implizite Rundung auf die Zahl durchführt, die ursprünglich gerundet werden sollte. Es finden also zwei Rundungen statt. Obwohl dies das Ergebnis ist, das ich erwarten würde, ist es technisch falsch.