Как подавить научную нотацию в Python?
вот мой код:
x = 1.0
y = 100000.0
print x/y
мой фактор отображается как 1.00000e-05
есть ли способ подавить научную нотацию и заставить ее отображаться как
0.00001? Как преобразовать научную нотацию в float.
спасибо заранее.
Это кажется несколько нелепым, чтобы спросить, но я не понял
а способа сделать это пока нет. Я собираюсь использовать результат в виде строки.
9 ответов:
'%f' % (x/y)но вы должны управлять точностью самостоятельно. например,
'%f' % (1/10**8)отображаются только нули.
подробности в документацииили для Python 3 эквивалентное старое форматирование или новое форматирование стиля
С более новыми версиями Python (2.6 и более поздних), вы можете использовать
''.format()чтобы выполнить то, что предложил @SilentGhost:'{0:f}'.format(x/y)
использование более новой версии
''.format(также не забудьте указать, сколько цифр после.вы хотите отобразить, это зависит от того, насколько мало плавающее число). См. этот пример:>>> a = -7.1855143557448603e-17 >>> '{:f}'.format(a) '-0.000000'как показано выше, по умолчанию-6 цифр! Это не полезно для нашего примера случая, поэтому вместо этого мы могли бы использовать что-то вроде этого:
>>> '{:.20f}'.format(a) '-0.00000000000000007186'обновление
начиная с Python 3.6, это можно упростить с помощью нового форматированную строку литерал следующим образом:
>>> f'{a:.20f}' '-0.00000000000000007186'
Это будет работать для любого показателя:
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
это с помощью ответ капитана огурца, но с 2 дополнениями.
1) позволяя функции получать номера ненаучных обозначений и просто возвращать их как есть (так что вы можете бросить много входных данных, что некоторые из чисел 0.00003123 vs 3.123 e-05 и все еще имеют работу функции.
2) Добавлена поддержка отрицательных чисел. (в оригинальной функции, отрицательное число будет в конечном итоге, как 0.0000-108904 от -1.08904 e-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
в дополнение к ответу SG, вы также можете использовать десятичный модуль:
from decimal import Decimal x = str(Decimal(1) / Decimal(10000)) # x is a string '0.0001'
если это
stringзатем используйте встроенныйfloatна то, чтобы сделать преобразование, например:print( "%.5f" % float("1.43572e-03"))ответ:0.00143572
используя 3.6.4, у меня была аналогичная проблема, что случайно число в выходном файле будет отформатировано с научной нотацией при использовании этого:
fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))все, что мне нужно было сделать, чтобы исправить это было добавить 'f':
fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))
Так как это лучший результат на Google, я буду публиковать здесь после того, как не удалось найти решение для моей проблемы. Если вы хотите отформатировать отображаемое значение объекта float и оставить его float - не строкой, вы можете использовать это решение:
создайте новый класс, который изменяет способ отображения значений с плавающей запятой.
from builtins import float class FormattedFloat(float): def __str__(self): return "{:.10f}".format(self).rstrip('0')вы можете изменить точность самостоятельно, изменив целочисленные значения в
{:f}
Comments