2011-01-07 2 views
4

I "g" für die Formatierung von Gleitkommazahlen verwenden, aber es schaltet auf wissenschaftliche Formatierung zu früh für mich - an der 5. Stelle:Python float Formatierung - wie „g“, aber mit mehr Ziffern

>>> format(0.0001, "g") 
'0.0001' 
>>> format(0.00001, "g") 
'1e-05' 

Dies scheint bis in den "g" Regeln (die -4) beschrieben werden:

die genauen Regeln sind wie folgt: Angenommen, dass das Ergebnis mit Darstellungs ‚e‘ formatiert und Präzision p-1 würde Exponent exp haben. Wenn dann -4 < = exp < p ist, wird die Nummer mit dem Präsentationstyp 'f' und der Genauigkeit p-1-exp formatiert. Andernfalls wird die Nummer mit dem Präsentationstyp 'e' und der Genauigkeit p-1 formatiert. In beiden Fällen werden nicht signifikante nachgestellte Nullen aus dem Signifikanden entfernt, und der Dezimalpunkt wird ebenfalls entfernt, wenn keine verbleibenden Ziffern folgen.

Gibt es eine Möglichkeit, Zahlen wie "g" anzuzeigen, aber mit mehr Ziffern, bevor Sie zur wissenschaftlichen Notation wechseln?

Ich denke an die Verwendung ".6f" und Strippen nach Nullen, aber dann werde ich nicht in der Lage, kleine Zahlen zu sehen, die wissenschaftliche Notation benötigen.

Antwort

3
from math import log10 

if log10(n) < -5: 
    print "%e" % n 
else: 
    print "%f" % n 

EDIT: es ist auch möglich, sie in einer einzigen Zeile zu setzen:

("%e" if log10(n) < -5 else "%f") % n 

Wenn n negativ sein könnte, dann log10(abs(n)) anstelle von log10(n) verwenden.

EDIT 2: auf Adal Kommentare Verbesserte Basis:

"%e" % n if n and log10(abs(n)) < -5 else ("%f" % n).rstrip("0") 

Dieses 0 als "0". Gedruckt wird - wenn Sie eine andere Darstellung wie "0" oder "0.0" wollen, müssen Sie Sonderfall es mit einem separaten if.

+0

+1 - oder, als Einzeiler: '(('% f', '% e') [log10 (n) <-5])% n '- die Lösung funktioniert jedoch mit positivem' n 'nur. – eumiro

+0

@eumiro: Guter Punkt auf den negativen Zahlen (aktualisierte die Antwort), aber ich mag deinen Einliner nicht wirklich. Das Indizieren eines Tupels mit booleschen Werten ist einfach ... nicht pythonisch. –

+0

.rstrip ("0") sollte zu der "% f" -Ausgabe hinzugefügt werden, so dass das Ergebnis mehr "% g" ähnelt – Meh

3

Wenn Sie mit Python sind 2.7 können Sie die folgenden Aktionen verwenden es erweiterte Zeichenfolge ist mini-language Formatierung:

>>> '{number:.{width}f}'.format(number=0.000000000001, width=20) 
'0.00000000000100000000' 

Anschließend können Sie den gewünschten Wert von number und width dynamisch angeben.

+0

Ich möchte immer noch exponentielle Notation für kleine Zahlen wie 1e-25, und nicht stattdessen 0,0000000000 anzeigen – Meh

1

Ich hatte die gleiche Frage.

Mit Blick auf die Python Dokumentation scheint es, dass g unterstützt auch Präzisionswerte:

Allgemeine Format. Für eine gegebene Genauigkeit p> = 1, rundet diese die Nummer p signifikanten Stellen und formatiert dann das Ergebnis in entweder Festkommaformat oder in wissenschaftlicher Notation, in Abhängigkeit von seiner Größenordnung.

Ich weiß nicht, warum die anderen Antworten dies nicht verwenden, und ich bin nicht sehr erfahren in Python, aber es funktioniert.

Dies kann einfach mit format(0.00001, '.10g') erreicht werden, wobei 10 die gewünschte Genauigkeit ist.