Ich habe gerade neu gelesen, was in Python 3.0 neu ist und es heißt:
Die Rundungsstrategie der Funktion round () und der Rückgabetyp haben sich geändert. Genaue Fälle auf halber Strecke werden jetzt auf das nächste gerade Ergebnis gerundet, anstatt von Null weg. (Zum Beispiel gibt Runde (2.5) jetzt 2 statt 3 zurück.)
und die Dokumentation für Runde :
Für die eingebauten Typen, die round () unterstützen, werden die Werte auf das nächste Vielfache von 10 zur Potenz minus n gerundet. Wenn zwei Vielfache gleich nahe beieinander liegen, wird auf die gerade Wahl gerundet
Also unter v2.7.3 :
In [85]: round(2.5)
Out[85]: 3.0
In [86]: round(3.5)
Out[86]: 4.0
wie ich erwartet hätte. Jetzt jedoch unter v3.2.3 :
In [32]: round(2.5)
Out[32]: 2
In [33]: round(3.5)
Out[33]: 4
Dies scheint nicht intuitiv zu sein und widerspricht dem, was ich über Rundungen verstehe (und zwangsläufig Menschen stolpern lässt). Englisch ist nicht meine Muttersprache, aber bis ich dies las, dachte ich, ich wüsste, was Rundung bedeutet: - / Ich bin mir sicher, dass es zum Zeitpunkt der Einführung von v3 einige Diskussionen darüber gegeben haben muss, aber ich konnte keinen guten Grund dafür finden meine Suche.
- Hat jemand einen Einblick, warum dies geändert wurde?
- Gibt es andere gängige Programmiersprachen (z. B. C, C ++, Java, Perl usw.), die diese Art von (für mich inkonsistenter) Rundung durchführen?
Was fehlt mir hier?
UPDATE: @ Li-aungYips Kommentar zu "Banker-Rundung" gab mir den richtigen Suchbegriff / die richtigen Suchbegriffe und ich fand diese SO-Frage: Warum verwendet .NET die Banker-Rundung als Standard? , also werde ich das sorgfältig lesen.
quelle
Antworten:
Der Weg von Python 3.0 wird heutzutage als Standardrundungsmethode angesehen, obwohl einige Sprachimplementierungen noch nicht im Bus sind.
Die einfache Technik "Immer 0,5 aufrunden" führt zu einer leichten Tendenz zur höheren Zahl. Bei einer großen Anzahl von Berechnungen kann dies von Bedeutung sein. Der Python 3.0-Ansatz beseitigt dieses Problem.
Es gibt mehr als eine gängige Rundungsmethode. IEEE 754, der internationale Standard für Gleitkomma-Mathematik, definiert fünf verschiedene Rundungsmethoden (die von Python 3.0 verwendete ist die Standardeinstellung). Und da sind noch andere.
Dieses Verhalten ist nicht so bekannt, wie es sein sollte. AppleScript war, wenn ich mich richtig erinnere, ein früher Anwender dieser Rundungsmethode. Der
round
Befehl in AppleScript bietet tatsächlich mehrere Optionen, aber Round-to-Even ist die Standardeinstellung wie in IEEE 754. Anscheinend hatte der Ingenieur, der denround
Befehl implementiert hat, alle Anfragen satt, "ihn so zu machen, wie ich es gelernt habe Schule ", die er genau das implementiert hat:round 2.5 rounding as taught in school
ist ein gültiger AppleScript-Befehl. :-)quelle
3
für2.5.round
Sie können erhalten Sie die Rundungssteuerung in Py3000 die mit Dezimal - Modul :
quelle
ROUND_HALF_UP
entspricht dem alten Verhalten von Python 2.X.setcontext()
Funktion.quantize(decimal.Decimal('1')
,quantize(decimal.Decimal('0.00')
wenn Sie auf die nächsten 100 runden möchten, z. B. für Geld.round(number, ndigits)
lange als Ersatz, wiendigits
es positiv ist, aber ärgerlicherweise können Sie sie nicht verwenden, um so etwas zu ersetzenround(5, -1)
.Nur um hier einen wichtigen Hinweis aus der Dokumentation hinzuzufügen:
https://docs.python.org/dev/library/functions.html#round
Seien Sie also nicht überrascht, wenn Sie in Python 3.2 folgende Ergebnisse erzielen:
quelle
2.675
genau dargestellt werden: Der Computer kann am nächsten kommen2.67499999999999982236431605997495353221893310546875
. Das ist ziemlich nah dran, aber es ist nicht genau gleich2.675
: es ist etwas näher2.67
als2.68
. Dieround
Funktion macht also das Richtige und rundet sie auf den näheren zweistelligen Wert nach dem Punkt, nämlich2.67
. Dies hat nichts mit Python zu tun und alles mit binärem Gleitkomma.Ich hatte kürzlich auch Probleme damit. Daher habe ich ein Python 3-Modul entwickelt, das zwei Funktionen hat: trueround () und trueround_precision (), die dies ansprechen und dasselbe Rundungsverhalten aufweisen, wie es von der Grundschule gewohnt ist (nicht die Rundung von Bankern). Hier ist das Modul. Speichern Sie einfach den Code und kopieren Sie ihn oder importieren Sie ihn. Hinweis: Das Modul trueround_precision kann das Rundungsverhalten je nach Bedarf gemäß den Flags ROUND_CEILING, ROUND_DOWN, ROUND_FLOOR, ROUND_HALF_DOWN, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_UP und ROUND_05UP ändern. Informationen zu den folgenden Funktionen finden Sie in den Dokumentzeichenfolgen oder verwenden Sie Hilfe (trueround) und Hilfe (trueround_precision), wenn Sie sie zur weiteren Dokumentation in einen Interpreter kopieren.
Hoffe das hilft,
Narnie
quelle
Python 3.x rundet .5-Werte auf einen geraden Nachbarn
Man kann jedoch die Dezimalrundung "zurück" ändern, um bei Bedarf immer .5 aufzurunden:
quelle
Rundungsverhalten von Python 2 in Python 3.
Hinzufügen von 1 an der 15. Dezimalstelle. Genauigkeit bis zu 15 Stellen.
quelle
2.675
ist2.67499999999999982236431605997495353221893310546875
. Durch Hinzufügen von 1e-15 wird es über 2,675 gekippt und korrekt gerundet. Wenn der Bruch bereits über der Codekonstante liegt, ändert das Hinzufügen von 1e-15 nichts an der Rundung.Manche Fälle:
Zur Behebung:
Wenn Sie mehr Dezimalstellen möchten, z. B. 4, sollten Sie (+ 0,0000001) hinzufügen.
Arbeite für mich.
quelle
Probenreproduktion:
API: https://docs.python.org/3/library/functions.html#round
Zustände:
Angesichts dieser Einsicht können Sie etwas Mathematik verwenden, um es zu lösen
Jetzt können Sie denselben Test mit my_round anstelle von round ausführen.
quelle
Der einfachste Weg, in Python 3.x zu runden, wie es in der Schule gelehrt wird, ist die Verwendung einer Hilfsvariablen:
Und dies sind die Ergebnisse der Serien 2.0 bis 3.0 (in Schritten von 0,1):
quelle
Sie können die Rundung mit dem Modul math.ceil steuern:
quelle
Versuchen Sie diesen Code:
Das Ergebnis wird sein:
Die Ausgabe können Sie hier überprüfen: https://i.stack.imgur.com/QQUkS.png
quelle