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.
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.
Odpowiedzi:
'%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
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'
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'
f"{a:.{precision}f}"
W nowszych wersjach Pythona (2.6 i nowsze) możesz ''.format()osiągnąć to, co zasugerował @SilentGhost:
'{0:f}'.format(x/y)
>>> print('{:f}'.format(0.000000123)) 0.000000
'{0:.10f}'
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
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='-')
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
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
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'
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}
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]))
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.