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.


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:



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'

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)

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

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='-')

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

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

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'

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


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}


-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]))

-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.

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.