Frage Begrenzung auf zwei Dezimalstellen


Ich will a abgerundet werden 13.95.

>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999

Das round Funktion funktioniert nicht so, wie ich es erwartet habe.


1118
2018-01-18 18:16


Ursprung


Antworten:


Sie stoßen auf das alte Problem mit Fließkommazahlen, dass alle Zahlen nicht dargestellt werden können. Die Befehlszeile zeigt nur die vollständige Fließkomma-Form aus dem Speicher.

In Floating Point ist Ihre gerundete Version die gleiche Nummer. Da Computer binär sind, speichern sie Gleitkommazahlen als eine Ganzzahl und teilen sie dann durch eine Zweierpotenz, so dass 13,95 in ähnlicher Weise dargestellt wird wie 125650429603636838 / (2 ** 53).

Zahlen mit doppelter Genauigkeit haben 53 Bits (16 Ziffern) Genauigkeit, und reguläre Gleitkommazahlen haben 24 Bits (8 Ziffern) Genauigkeit. Das Gleitkomma in Python verwendet doppelte Genauigkeit um die Werte zu speichern.

Beispielsweise,

  >>> 125650429603636838/(2**53)
  13.949999999999999

  >>> 234042163/(2**24)
  13.949999988079071

  >>> a=13.946
  >>> print(a)
  13.946
  >>> print("%.2f" % a)
  13.95
  >>> round(a,2)
  13.949999999999999
  >>> print("%.2f" % round(a,2))
  13.95
  >>> print("{0:.2f}".format(a))
  13.95
  >>> print("{0:.2f}".format(round(a,2)))
  13.95
  >>> print("{0:.15f}".format(round(a,2)))
  13.949999999999999

Wenn Sie nach nur zwei Dezimalstellen wie in der Währung sind, dann haben Sie ein paar bessere Möglichkeiten: 1) Verwenden Sie Ganzzahlen und speichern Sie Werte in Cents, nicht Dollar und dann durch 100 dividieren, um in Dollar zu konvertieren. 2) Oder verwende eine feste Punktnummer wie Dezimal.


1154
2018-01-18 18:23



Es gibt neue Formatspezifikationen, String Format Spezifikation Mini-Sprache:

Sie können dasselbe tun wie:

"{0:.2f}".format(13.949999999999999)

Hinweis dass das obige eine Zeichenfolge zurückgibt. Um als Float zu erhalten, wickeln Sie einfach mit float(...):

float("{0:.2f}".format(13.949999999999999))

Hinweis diese Verpackung mit float() ändert nichts

>>> x = 13.949999999999999999
>>> x
13.95
>>> g = float("{0:.2f}".format(x))
>>> g
13.95
>>> x == g
True
>>> h = round(x, 2)
>>> h
13.95
>>> x == h
True

423
2018-06-30 18:53



Das eingebaute round() funktioniert in Python 2.7 oder höher einwandfrei.

Beispiel:

>>> round(14.22222223, 2)
14.22

Auschecken die Dokumentation.


138
2017-12-31 10:51



Ich denke, dass der einfachste Ansatz darin besteht, den format() Funktion.

Beispielsweise:

a = 13.949999999999999
format(a, '.2f')

13.95

Dies erzeugt eine Fließkommazahl als eine auf zwei Dezimalstellen gerundete Zeichenkette.


118
2018-01-25 22:26



Die meisten Zahlen können nicht genau in Schwimmern dargestellt werden. Wenn Sie die Zahl runden wollen, weil dies Ihre mathematische Formel oder Ihr Algorithmus erfordert, dann möchten Sie round verwenden. Wenn Sie die Anzeige nur auf eine bestimmte Genauigkeit beschränken möchten, verwenden Sie nicht einmal round und formatieren Sie sie einfach als diese Zeichenfolge. (Wenn Sie es mit einer alternativen Rundungsmethode anzeigen möchten, und es gibt Tonnen, dann müssen Sie die beiden Ansätze mischen.)

>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'

Und schließlich, wenn auch vielleicht am wichtigsten, wenn Sie wollen genau Mathe, dann willst du gar nicht schweben. Das übliche Beispiel beschäftigt sich mit Geld und speichert "Cents" als Integer.


85
2018-01-18 18:40



Probieren Sie den folgenden Code aus:

>>> a = 0.99334
>>> a = int((a * 100) + 0.5) / 100.0 # Adding 0.5 rounds it up
>>> print a
0.99

65
2017-08-26 06:46



Bei Python <3 (z. B. 2.6 oder 2.7) gibt es zwei Möglichkeiten.

# Option one 
older_method_string = "%.9f" % numvar

# Option two (note ':' before the '.9f')
newer_method_string = "{:.9f}".format(numvar)

Beachten Sie jedoch, dass für Python-Versionen über 3 (z. B. 3.2 oder 3.3) Option zwei ist bevorzugt.

Für weitere Informationen zu Option zwei empfehle ich diesen Link auf String-Formatierung aus der Python-Dokumentation.

Und für weitere Informationen über Option eins, Dieser Link wird ausreichen und enthält Informationen zu den verschiedenen Flaggen.

Referenz: Konvertieren Sie Gleitkommazahlen in eine bestimmte Genauigkeit und kopieren Sie sie dann in eine Zeichenfolge


49
2017-12-11 06:37



Sie können das Ausgabeformat ändern:

>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95

39
2018-01-18 18:31