Вот мой код:
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'
f"{a:.{precision}f}"
В более новых версиях Python (2.6 и более поздних) вы можете использовать ''.format()
для выполнения предложенного @SilentGhost:
'{0:f}'.format(x/y)
>>> print('{:f}'.format(0.000000123))
0.000000
'{0:.10f}'
Другой вариант, если вы используете панд и хотите отключить научное обозначение для всех поплавков, это настроить параметры панд.
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
Большинство ответов выше требуют от вас указать точность. Но что, если вы хотите отображать числа с плавающей точкой, как это, без лишних нулей:
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='-')
Это будет работать для любого показателя:
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 против 3.123e-05 и по-прежнему работают).
2) добавлена поддержка отрицательных чисел. (в исходной функции отрицательное число будет заканчиваться как 0,0000-108904 от -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 вы также можете использовать десятичный модуль:
from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))
# x is a string '0.0001'
Поскольку это лучший результат в Google, я опубликую здесь, не найдя решения своей проблемы. Если вы хотите отформатировать отображаемое значение объекта с плавающей точкой и оставить его с плавающей точкой, а не строку, вы можете использовать это решение:
Создайте новый класс, который изменяет способ отображения значений с плавающей запятой.
from builtins import float
class FormattedFloat(float):
def __str__(self):
return "{:.10f}".format(self).rstrip('0')
Вы можете изменить точность самостоятельно, изменив целочисленные значения в {:f}
Используя 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]))
Начиная с версии 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
ввода, таким образом, актерский состав.