Вот мой код:
x = 1.0
y = 100000.0
print x/y
Мой коэффициент отображается как 1.00000e-05
Есть ли способ подавить научную запись и заставить ее отображать 0.00001
? Я собираюсь использовать результат в виде строки.
Вот мой код:
x = 1.0
y = 100000.0
print x/y
Мой коэффициент отображается как 1.00000e-05
Есть ли способ подавить научную запись и заставить ее отображать 0.00001
? Я собираюсь использовать результат в виде строки.
'%f' % (x/y)
но вам нужно точно управлять точностью. например.
'%f' % (1/10**8)
будет отображаться только нули.
подробности находятся в документах
Или для Python 3 эквивалентное старое форматирование или
Использование более новой версии ''.format
(также не забудьте указать, сколько цифр после .
вы хотите отобразить, это зависит от того, насколько мал - плавающее число). См. Этот пример:
>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'
как показано выше, значение по умолчанию - 6 цифр! Это не полезно для нашего примера, поэтому вместо этого мы могли бы использовать что-то вроде этого:
>>> '{:.20f}'.format(a)
'-0.00000000000000007186'
Начиная с Python 3.6, это можно упростить с помощью нового форматированного строкового литерала следующим образом:
>>> f'{a:.20f}'
'-0.00000000000000007186'
С более новыми версиями Python (2.6 и более поздних) вы можете использовать ''.format()
для выполнения того, что предложил @SilentGhost:
'{0:f}'.format(x/y)
Другой вариант, если вы используете панд и хотите отключить научное обозначение для всех поплавков, это настроить параметры панд.
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
Это будет работать для любого показателя:
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
Это использует ответ Captain Cucumber, но с двумя дополнениями.
1) позволяя функции получать номера ненаучных обозначений и просто возвращать их как есть (так что вы можете добавить много входных данных, что некоторые числа равны 0.00003123 против 3.123e-05 и по-прежнему работают).
2) добавлена поддержка отрицательных чисел. (в исходной функции отрицательное число будет заканчиваться как 0,0000 -1 08904 из -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
Кроме ответа SG, вы также можете использовать модуль Decimal:
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, я опубликую здесь, не найдя решения своей проблемы. Если вы хотите отформатировать отображаемое значение объекта с плавающей точкой и оставить его с плавающей точкой, а не строку, вы можете использовать это решение:
Создайте новый класс, который изменяет способ отображения значений с плавающей запятой.
from builtins import float
class FormattedFloat(float):
def __str__(self):
return "{:.10f}".format(self).rstrip('0')
Вы можете сами изменить точность, изменив целочисленные значения в {:f}
Начиная с версии 3.6 (возможно, также работает с более старыми версиями 3.x), это мое решение:
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')
Цель вычисления precision
состоит в том, чтобы гарантировать, что у нас достаточно точности, чтобы не попадать в научную нотацию (точность по умолчанию все еще равна 6).
Аргумент dec_precision
добавляет дополнительную точность для использования для десятичных точек. Поскольку для этого используется формат n
, незначительные нули не будут добавлены (в отличие от форматов f
). n
также позаботится о рендеринге уже круглых целых чисел без десятичной дроби.
n
требует float
ввода, таким образом, приведение.
Большинство ответов выше требуют указания точности. Но что, если вы хотите отображать числа с плавающей точкой, как это, без лишних нулей:
1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001
numpy
имеет ответ: np.format_float_positional
import numpy as np
def format_float(num):
return np.format_float_positional(num, trim='-')