Jak pominąć notację naukową podczas drukowania wartości zmiennoprzecinkowych?

147

Oto mój kod:

x = 1.0
y = 100000.0    
print x/y

Mój iloraz wyświetla się jako 1.00000e-05.

Czy istnieje sposób, aby usunąć notację naukową i wyświetlić ją jako 0.00001? Użyję wyniku jako ciągu.

Matt
źródło
1
1/10000 = 0,0001 = 1,00000e-04
Adrian Archer
@AA, zakładając, że była to literówka w instrukcji przypisania, poprawiłem to.
Dana
Rozczarowujące jest to, że żadna z odpowiedzi tutaj nie dotyczy tego pytania. Byłoby miło, gdyby istniał sposób, aby w ogóle uniemożliwić pythonowi (3) używanie notacji naukowej, chyba że zostanie to wyraźnie określone. Wszystkie odpowiedzi wymagają od użytkownika jawnego wyłączenia notacji naukowej, co nie jest tym samym, co generalne powstrzymywanie niejawnego używania notacji naukowej z poziomu Pythona.
BLUC

Odpowiedzi:

64
'%f' % (x/y)

ale musisz sam zarządzać precyzją. na przykład,

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

wyświetli tylko zera.
szczegóły w dokumentacji

Lub w przypadku Pythona 3 równoważne stare formatowanie lub nowsze formatowanie stylu

SilentGhost
źródło
7
Proponuję wyjaśnić swoje stwierdzenie, mówiąc: „sam zarządzasz pokazem precyzji”. Rzeczywista (wewnętrzna w Pythonie) precyzja nie jest zmieniana, jak to często ma miejsce w innych językach.
JS.
92

Korzystając z nowszej wersji ''.format(pamiętaj również, aby określić, ile cyfr po .znaku chcesz wyświetlić, zależy to od tego, jak mała jest liczba zmiennoprzecinkowa). Zobacz ten przykład:

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

jak pokazano powyżej, domyślnie jest to 6 cyfr! Nie jest to pomocne w naszym przykładzie przypadku, więc zamiast tego możemy użyć czegoś takiego:

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

Aktualizacja

Począwszy od Pythona 3.6, można to uprościć za pomocą nowego sformatowanego literału ciągu w następujący sposób:

>>> f'{a:.20f}'
'-0.00000000000000007186'
Aziz Alto
źródło
Jak jednak to zrobić, określając cyfry znaczące?
Marses,
Wydaje mi się, że używając zmiennej, nadaj jej żądaną liczbę cyfr i użyj jej zamiast liczby literalnej np.f"{a:.{precision}f}"
Aziz Alto
49

W nowszych wersjach Pythona (2.6 i nowsze) możesz ''.format()osiągnąć to, co zasugerował @SilentGhost:

'{0:f}'.format(x/y)
nmichaels
źródło
1
Czy naprawdę tego chcesz? Ja nie: >>> print('{:f}'.format(0.000000123)) 0.000000
duality_
1
@duality może być konieczne określenie precyzji. '{0:.10f}'
nmichaels
24

Inną opcją, jeśli używasz pand i chciałbyś wyłączyć notację naukową dla wszystkich pływaków, jest dostosowanie opcji pand.

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
Josh Janjua
źródło
10

Większość powyższych odpowiedzi wymaga określenia precyzji. Ale co, jeśli chcesz wyświetlać takie elementy zmiennoprzecinkowe, bez zbędnych zer:

1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001

numpy ma odpowiedź: np.format_float_positional

import numpy as np

def format_float(num):
    return np.format_float_positional(num, trim='-')
Dennis Golomazov
źródło
5

To zadziała dla dowolnego wykładnika:

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
Kapitanie Ogórek
źródło
4

To używa odpowiedzi Kapitana Ogórka , ale z 2 dodatkami.

1) pozwalając funkcji na otrzymanie liczb w notacji nienaukowej i po prostu zwrócenie ich bez zmian (więc możesz wrzucić dużo danych wejściowych, że niektóre z liczb to 0,00003123 w porównaniu do 3,123e-05 i nadal funkcja działa.

2) dodano obsługę liczb ujemnych. (w oryginalnej funkcji liczba ujemna kończyłaby się na 0,0000-108904 z -1.08904e-05)

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
źródło
3

Oprócz odpowiedzi SG możesz również użyć modułu Decimal:

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

# x is a string '0.0001'
Dana
źródło
14
zwraca się do notacji naukowej dla wartości mniejszych niż 1e-6
SilentGhost
2

Jeśli jest stringto użyj wbudowanego floatna nim do wykonania konwersji, na przykład: print( "%.5f" % float("1.43572e-03")) odpowiedź:0.00143572

U-571
źródło
1

Ponieważ jest to najlepszy wynik w Google, opublikuję tutaj po nieudanym znalezieniu rozwiązania mojego problemu. Jeśli chcesz sformatować wartość wyświetlaną obiektu zmiennoprzecinkowego i pozostawić ją zmiennoprzecinkową, a nie ciągiem znaków, możesz użyć następującego rozwiązania:

Utwórz nową klasę, która modyfikuje sposób wyświetlania wartości zmiennoprzecinkowych.

from builtins import float
class FormattedFloat(float):

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

Możesz samodzielnie zmodyfikować dokładność, zmieniając wartości całkowite w {:f}

Jared Marks
źródło
-1

Używając 3.6.4, miałem podobny problem, że losowo liczba w pliku wyjściowym byłaby sformatowana przy użyciu notacji naukowej podczas używania tego:

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

Wszystko, co musiałem zrobić, aby to naprawić, to dodać `` f '':

fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))
Scott Lohr
źródło
-1

Od wersji 3.6 (prawdopodobnie działa również z nieco starszą wersją 3.x), oto moje rozwiązanie:

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

Celem precisionobliczeń jest upewnienie się, że mamy wystarczającą precyzję, aby uniknąć stosowania notacji naukowej (domyślna dokładność nadal wynosi 6).

dec_precisionArgumentem dodaje dodatkową precyzję używaną do miejsc po przecinku. Ponieważ korzysta z nformatu, nie zostaną dodane żadne nieznaczące zera (w przeciwieństwie do fformatów). nzajmie się również renderowaniem już zaokrąglonych liczb całkowitych bez dziesiętnych.

nwymaga floatwkładu, więc obsada.

Alex S.
źródło