In der Dokumentation für die Funktion round () wird angegeben, dass Sie eine Zahl und die Positionen nach der Dezimalstelle an round übergeben. Also sollte es dies tun:
n = 5.59
round(n, 1) # 5.6
Aber in Wirklichkeit schleicht sich eine gute alte Gleitkomma-Verrücktheit ein und Sie erhalten:
5.5999999999999996
Für die Zwecke der Benutzeroberfläche muss ich anzeigen 5.6
. Ich habe mich im Internet umgesehen und eine Dokumentation gefunden , die von meiner Implementierung von Python abhängt. Leider tritt dies sowohl auf meinem Windows-Entwicklungscomputer als auch auf jedem Linux-Server auf, den ich ausprobiert habe. Siehe auch hier .
Gibt es einen Weg, dies zu umgehen, ohne meine eigene runde Bibliothek zu erstellen?
python
floating-point
rounding
Swilliams
quelle
quelle
round(5.55, 1) = 5.5
.Antworten:
Ich kann nicht anders, als es gespeichert ist, aber zumindest funktioniert die Formatierung korrekt:
quelle
print '%.2f' % 655.665
aber es kehrt zurück655.66
, es sollte sein655.67
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_DOWN
# Verwendung beim Runden von GleitkommazahlenDecimal(str(655.665)).quantize(Decimal('1.11'), rounding=ROUND_HALF_UP)
# Probleme und Einschränkungen in GleitkommazahlenDie Formatierung funktioniert auch ohne Runden:
quelle
"{:.1f}".format(n)
'%.5f' % 0.988625
0.98862
Wenn Sie das Dezimalmodul verwenden, können Sie ohne Verwendung der Funktion 'rund' approximieren. Folgendes habe ich zum Runden verwendet, insbesondere beim Schreiben von Geldanträgen:
Dies gibt eine Dezimalzahl zurück, die 16,20 beträgt.
quelle
rounding='ROUND_UP'
NameError: global name 'ROUND_UP' is not defined
, müssen Sie Ihre Rundungsfunktion importieren :from decimal import Decimal, ROUND_UP
. Andere Rundungsfunktionenround(5.59, 1)
funktioniert gut. Das Problem ist, dass 5.6 nicht genau im binären Gleitkomma dargestellt werden kann.Wie Vinko sagt, können Sie die Zeichenfolgenformatierung verwenden, um die Anzeige abzurunden.
Python hat ein Modul für Dezimalarithmetik, wenn Sie das brauchen.
quelle
Sie erhalten '5.6', wenn Sie dies tun,
str(round(n, 1))
anstatt nurround(n, 1)
.quelle
Sie können den Datentyp in eine Ganzzahl ändern:
Zeigen Sie dann die Nummer an, indem Sie das Dezimaltrennzeichen des Gebietsschemas einfügen.
Doch Jimmys Antwort ist besser.
quelle
Gleitkomma-Mathematik ist anfällig für leichte, aber ärgerliche Präzisionsungenauigkeiten. Wenn Sie mit Ganzzahlen oder Festpunkten arbeiten können, ist Ihnen Präzision garantiert.
quelle
Schauen Sie sich das Dezimalmodul an
und
Dezimal bietet die Art von Operationen , die es einfach zu schreiben Anwendungen machen , die Floating - Point - Operationen erfordern und auch müssen diese Ergebnisse in einem für Menschen lesbares Format präsentieren, zum Beispiel Buchhaltung.
quelle
Drucken Sie den Sauger.
quelle
Das ist in der Tat ein großes Problem. Probieren Sie diesen Code aus:
Es zeigt 4.85 an. Dann machst du:
und es zeigt 4.8. Berechnen Sie von Hand, lautet die genaue Antwort 4,85, aber wenn Sie es versuchen:
Sie können die Wahrheit sehen: Der Gleitkomma wird als die nächste endliche Summe von Brüchen gespeichert, deren Nenner Zweierpotenzen sind.
quelle
Sie können den Zeichenfolgenformatoperator
%
ähnlich wie sprintf verwenden.quelle
Funktioniert perfekt
quelle
Ich mache:
In diesem Fall runden wir zuerst auf Einheitenebene richtig und konvertieren dann in eine Ganzzahl, um das Drucken eines Gleitkommas zu vermeiden.
so
Ich denke, diese Antwort funktioniert besser als das Formatieren der Zeichenfolge, und es ist für mich auch sinnvoller, die Rundungsfunktion zu verwenden.
quelle
Ich würde es
round()
in diesem Fall vermeiden, mich überhaupt darauf zu verlassen . Erwägenwird ausgegeben
Dies ist keine gewünschte Ausgabe, wenn Sie eine feste Rundung auf die nächste Ganzzahl benötigen. Um dieses Verhalten zu umgehen, gehen Sie mit
math.ceil()
(odermath.floor()
wenn Sie abrunden möchten):Ausgänge
Hoffentlich hilft das.
quelle
Code:
Ausgabe:
quelle
Hier sehe ich, dass die Runde versagt. Was wäre, wenn Sie diese beiden Zahlen auf eine Dezimalstelle runden möchten? 23.45 23.55 Meine Ausbildung war, dass Sie durch Runden dieser erhalten sollten: 23.4 23.6 Die "Regel" ist, dass Sie aufrunden sollten, wenn die vorhergehende Zahl ungerade war, nicht aufrunden, wenn die vorhergehende Zahl gerade war. Die Rundungsfunktion in Python schneidet einfach die 5 ab.
quelle
Das Problem ist nur, wenn die letzte Ziffer 5 ist. ZB. 0.045 wird intern als 0.04499999999999999 gespeichert ... Sie können die letzte Ziffer einfach auf 6 erhöhen und abrunden. Dadurch erhalten Sie die gewünschten Ergebnisse.
quelle
Eine weitere mögliche Option ist:
quelle
Wie wäre es mit:
quelle
epsilon = .000001
dannround(1.0/5.0, 1) + epsilon
würde die genaue Darstellung 0,2 nehmen und es 0,00001 machen. Ebenso schlimme Probleme würden auftreten, wenn sich das Epsilon innerhalb der runden Funktion befände.