web-dev-qa-db-de.com

print float auf n Dezimalstellen einschließlich nachstehender Nullen

Ich muss eine Gleitkommazahl in eine Zeichenfolge mit 15 Dezimalstellen drucken oder konvertieren, auch wenn das Ergebnis viele nachgestellte Nullen hat, z. B .:

1.6 wird 1.6000000000000000

Ich habe es mit round (6.2,15) versucht, aber es gibt 6.20000000000002 zurück und fügt einen Rundungsfehler hinzu

Ich habe auch verschiedene Leute online gesehen, die den Schwimmer in eine Zeichenkette gesteckt und dann manuell nachgestellte 0en hinzugefügt haben, aber das scheint schlecht zu sein ...

Wie geht das am besten?

32
jonathan topf

Für Python Versionen in 2.6+ und 3.x

Du kannst den ... benutzen str.format Methode. Beispiele:

>>> print('{0:.16f}'.format(1.6))
1.6000000000000001

>>> print('{0:.15f}'.format(1.6))
1.600000000000000

Beachten Sie das 1 am Ende des ersten Beispiels ist ein Rundungsfehler; Dies liegt daran, dass für die exakte Darstellung der Dezimalzahl 1.6 eine unendliche Anzahl von Binärziffern erforderlich ist. Da Gleitkommazahlen eine endliche Anzahl von Bits haben, wird die Zahl auf einen nahegelegenen, aber nicht gleichen Wert gerundet.

Für Python Versionen vor 2.6 (mindestens zurück zu 2.0)

Sie können die "Modulo-Formatierungs" -Syntax verwenden (dies funktioniert auch für Python 2.6 und 2.7):

>>> print '%.16f' % 1.6
1.6000000000000001

>>> print '%.15f' % 1.6
1.600000000000000
59
David Alber

Gleitkommazahlen sind nicht präzise genug, um "1.6" bis auf so viele Dezimalstellen genau wiederzugeben. Die Rundungsfehler sind real. Deine Nummer ist eigentlich nicht 1.6.

Check out: http://docs.python.org/library/decimal.html

5
dkamins

Ich vermute, dass dies im Wesentlichen eine Zeichenfolge ist, aber dies vermeidet den Rundungsfehler:

import decimal

def display(x):
    digits = 15
    temp = str(decimal.Decimal(str(x) + '0' * digits))
    return temp[:temp.find('.') + digits + 1]
4
BenH