Wie kann die wissenschaftliche Notation beim Drucken von Float-Werten unterdrückt werden?

147

Hier ist mein Code:

x = 1.0
y = 100000.0    
print x/y

Mein Quotient wird als angezeigt 1.00000e-05.

Gibt es eine Möglichkeit, die wissenschaftliche Notation zu unterdrücken und als anzuzeigen 0.00001? Ich werde das Ergebnis als Zeichenfolge verwenden.

Matt
quelle
1
1/10000 = 0,0001 = 1.00000e-04
Adrian Archer
@AA, vorausgesetzt, es war ein Tippfehler in der Zuweisungsanweisung, habe ich ihn korrigiert.
Dana
Es ist enttäuschend, dass keine der Antworten hier die Frage anspricht. Es wäre schön, wenn es eine Möglichkeit gäbe, zu verhindern, dass Python (3) überhaupt wissenschaftliche Notation verwendet, außer wenn dies explizit angegeben wird. Alle Antworten erfordern, dass der Benutzer die wissenschaftliche Notation explizit unterdrückt, was nicht mit der allgemeinen Unterdrückung der impliziten Verwendung der wissenschaftlichen Notation aus Python heraus identisch ist.
BLUC

Antworten:

64
'%f' % (x/y)

Aber Sie müssen die Präzision selbst verwalten. z.B,

'%f' % (1/10**8)

zeigt nur Nullen an.
Details finden Sie in den Dokumenten

Oder für Python 3 die entsprechende alte Formatierung oder die neuere Formatierung

SilentGhost
quelle
7
Ich schlage vor, Ihre Aussage zu präzisieren und zu sagen: "Sie verwalten die Anzeige der Präzision selbst." Die tatsächliche (Python-interne) Genauigkeit wird nicht geändert, wie dies häufig in anderen Sprachen der Fall ist.
JS.
92

Verwenden Sie die neuere Version ''.format(denken Sie auch daran, anzugeben, wie viele Ziffern nach der .Anzeige angezeigt werden sollen. Dies hängt davon ab, wie klein die schwebende Zahl ist). Siehe dieses Beispiel:

>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'

Wie oben gezeigt, ist die Standardeinstellung 6 Stellen! Dies ist für unser Fallbeispiel nicht hilfreich, daher könnten wir stattdessen Folgendes verwenden:

>>> '{:.20f}'.format(a)
'-0.00000000000000007186'

Aktualisieren

Ab Python 3.6 kann dies mit dem neuen formatierten String-Literal wie folgt vereinfacht werden:

>>> f'{a:.20f}'
'-0.00000000000000007186'
Aziz Alto
quelle
Wie geht das, während signifikante Zahlen angegeben werden?
Marses
Ich denke, indem Sie eine Variable verwenden, geben Sie ihr die gewünschte Anzahl von Ziffern und verwenden Sie sie anstelle der Literalzahl, z. B.f"{a:.{precision}f}"
Aziz Alto
49

Mit neueren Versionen von Python (2.6 und höher) können Sie ''.format()Folgendes erreichen, wie @SilentGhost vorgeschlagen hat:

'{0:f}'.format(x/y)
nmichaels
quelle
1
Willst du das wirklich? Ich nicht: >>> print('{:f}'.format(0.000000123)) 0.000000
Dualität_
1
@duality Möglicherweise müssen Sie die Genauigkeit angeben. '{0:.10f}'
Nmichaels
24

Eine andere Option, wenn Sie Pandas verwenden und die wissenschaftliche Notation für alle Floats unterdrücken möchten, besteht darin, die Pandas-Optionen anzupassen.

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
Josh Janjua
quelle
10

Bei den meisten der oben genannten Antworten müssen Sie die Genauigkeit angeben. Aber was ist, wenn Sie Floats wie diese ohne unnötige Nullen anzeigen möchten:

1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001

numpy hat eine Antwort: np.format_float_positional

import numpy as np

def format_float(num):
    return np.format_float_positional(num, trim='-')
Dennis Golomazov
quelle
5

Dies funktioniert für jeden Exponenten:

def getExpandedScientificNotation(flt):
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    return return_val
Kapitän Gurke
quelle
4

Dies verwendet die Antwort von Captain Cucumber , jedoch mit 2 Ergänzungen.

1) Ermöglichen, dass die Funktion nicht wissenschaftliche Notationsnummern erhält und sie einfach so zurückgibt, wie sie sind (so können Sie eine Menge Eingaben machen, dass einige der Zahlen 0,00003123 gegenüber 3,123e-05 sind und immer noch Funktionsarbeit haben.

2) Unterstützung für negative Zahlen hinzugefügt. (In der ursprünglichen Funktion würde eine negative Zahl wie 0,0000-108904 von -1,08904e-05 enden.)

def getExpandedScientificNotation(flt):
    was_neg = False
    if not ("e" in flt):
        return flt
    if flt.startswith('-'):
        flt = flt[1:]
        was_neg = True 
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    if was_neg:
        return_val='-'+return_val
    return return_val
Finn42
quelle
3

Zusätzlich zur Antwort von SG können Sie auch das Dezimalmodul verwenden:

from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))

# x is a string '0.0001'
Dana
quelle
14
es wird zur wissenschaftlichen Notation für Werte kleiner als 1e-6
SilentGhost
2

Wenn es sich um eine handelt, stringverwenden Sie die integrierte floatKonvertierung, um beispielsweise die Konvertierung durchzuführen: print( "%.5f" % float("1.43572e-03")) Antwort:0.00143572

U-571
quelle
1

Da dies das Top-Ergebnis bei Google ist, werde ich hier posten, nachdem ich keine Lösung für mein Problem gefunden habe. Wenn Sie den Anzeigewert eines Float-Objekts formatieren und es als Float - nicht als Zeichenfolge - beibehalten möchten, können Sie folgende Lösung verwenden:

Erstellen Sie eine neue Klasse, die die Art und Weise ändert, in der Float-Werte angezeigt werden.

from builtins import float
class FormattedFloat(float):

    def __str__(self):
        return "{:.10f}".format(self).rstrip('0')

Sie können die Genauigkeit selbst ändern, indem Sie die Ganzzahlwerte in ändern {:f}

Jared Marks
quelle
-1

Bei Verwendung von 3.6.4 hatte ich ein ähnliches Problem, bei dem zufällig eine Zahl in der Ausgabedatei mit wissenschaftlicher Notation formatiert wurde, wenn Folgendes verwendet wurde:

fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))

Alles was ich tun musste, um das Problem zu beheben, war 'f' hinzuzufügen:

fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))
Scott Lohr
quelle
-1

Ab 3.6 (funktioniert wahrscheinlich auch mit etwas älterem 3.x) ist dies meine Lösung:

import locale
locale.setlocale(locale.LC_ALL, '')

def number_format(n, dec_precision=4):
    precision = len(str(round(n))) + dec_precision
    return format(float(n), f'.{precision}n')

Der Zweck der precisionBerechnung besteht darin, sicherzustellen, dass wir genügend Genauigkeit haben, um nicht in die wissenschaftliche Notation einzutreten (die Standardgenauigkeit beträgt immer noch 6).

Das dec_precisionArgument fügt zusätzliche Genauigkeit hinzu, die für Dezimalstellen verwendet werden kann. Da dies das nFormat verwendet, werden (im Gegensatz zu fFormaten) keine unbedeutenden Nullen hinzugefügt . nkümmert sich auch darum, bereits runde Ganzzahlen ohne Dezimalstelle zu rendern.

nerfordert floatEingabe, also die Besetzung.

Alex S.
quelle