Python-Dezimalformat


Antworten:


118

Wenn Sie Python 2.6 oder neuer haben, verwenden Sie format:

'{0:.3g}'.format(num)

Für Python 2.5 oder älter:

'%.3g'%(num)

Erläuterung:

{0}weist formatan, das erste Argument zu drucken - in diesem Fall num.

Alles nach dem Doppelpunkt (:) gibt das an format_spec.

.3 setzt die Genauigkeit auf 3.

gEntfernt unbedeutende Nullen. Siehe http://en.wikipedia.org/wiki/Printf#fprintf

Zum Beispiel:

tests=[(1.00, '1'),
       (1.2, '1.2'),
       (1.23, '1.23'),
       (1.234, '1.23'),
       (1.2345, '1.23')]

for num, answer in tests:
    result = '{0:.3g}'.format(num)
    if result != answer:
        print('Error: {0} --> {1} != {2}'.format(num, result, answer))
        exit()
    else:
        print('{0} --> {1}'.format(num,result))

ergibt

1.0 --> 1
1.2 --> 1.2
1.23 --> 1.23
1.234 --> 1.23
1.2345 --> 1.23

Mit Python 3.6 oder neuer können Sie Folgendes verwenden f-strings:

In [40]: num = 1.234; f'{num:.3g}'
Out[40]: '1.23'

17
Es scheint, dass dies Python 2.7 veranlasst, in die wissenschaftliche Notation für größere Zahlen zu wechseln: >>> "{0: .3g}". Format (100.20) '100' >>> "{0: .3g}". Format (1001.20 ) '1e + 03'
vdboor

4
Also, wie man nein setzt Exponent notation. Als {:,2f}.format(number)Dosis, entfernt aber auch unbedeutende Nullen
Aylwyn Lake

1
@unutbu - Irgendeine Idee, wie man '{0: .3g}' für Python fStrings zum Laufen bringt?
Scott Skiles

1
@ScottSkiles: Gibt num=1.2345; f'{num:.3g}'zurück '1.23'. Siehe diese Erklärung der Codeäquivalenz .
Unutbu

Genial! Lohnt sich eine Bearbeitung dieser Antwort? Ich habe das woanders auf SO gefunden.
Scott Skiles

25

Nur der erste Teil von Justins Antwort ist richtig. Die Verwendung von "% .3g" funktioniert nicht in allen Fällen, da .3 nicht die Genauigkeit, sondern die Gesamtzahl der Ziffern ist. Versuchen Sie es für Zahlen wie 1000.123 und es bricht.

Also würde ich verwenden, was Justin vorschlägt:

>>> ('%.4f' % 12340.123456).rstrip('0').rstrip('.')
'12340.1235'
>>> ('%.4f' % -400).rstrip('0').rstrip('.')
'-400'
>>> ('%.4f' % 0).rstrip('0').rstrip('.')
'0'
>>> ('%.4f' % .1).rstrip('0').rstrip('.')
'0.1'

14

Hier ist eine Funktion, die den Trick macht:

def myformat(x):
    return ('%.2f' % x).rstrip('0').rstrip('.')

Und hier sind Ihre Beispiele:

>>> myformat(1.00)
'1'
>>> myformat(1.20)
'1.2'
>>> myformat(1.23)
'1.23'
>>> myformat(1.234)
'1.23'
>>> myformat(1.2345)
'1.23'

Bearbeiten:

Als ich mir die Antworten anderer Leute ansah und experimentierte, stellte ich fest, dass g das ganze Strippen für Sie erledigt. Damit,

'%.3g' % x

funktioniert auch hervorragend und unterscheidet sich geringfügig von dem, was andere Leute vorschlagen (mit '{0: .3}'. format () Zeug). Ich denke, treffen Sie Ihre Wahl.


Nett. Viel sauberer als meine.
Mike Cialowicz

4
Wenn Sie so etwas wie 0,0000005 bekommen, obwohl ich glaube, dass '% .3g'% x Ihnen Exponenten geben wird?
Teuer

4

Verwenden Sie einfach Pythons Standard- Formatierungsmethoden für Zeichenfolgen :

>>> "{0:.2}".format(1.234232)
'1.2'
>>> "{0:.3}".format(1.234232)
'1.23'

Wenn Sie eine Python-Version unter 2.6 verwenden, verwenden Sie

>>> "%f" % 1.32423
'1.324230'
>>> "%.2f" % 1.32423
'1.32'
>>> "%d" % 1.32423
'1'

2
Dies ist keine allgemeine Lösung und funktioniert nicht für Zahlen mit nachgestellten Nullen.
Mike Cialowicz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.