Python Scientific Notation прецизионная нормализация
Моя цель - просто преобразовать строку, такую как "1.2", в научную нотацию без дополнительной точности. Проблема в том, что я всегда получаю лишние 0 в конце моего вывода.
>>> input = "1.2"
>>> print '{:e}'.format(float(input))
1.200000e+00
Я пытаюсь выяснить, как получить только 1.2e+00
. Я понимаю, что могу указать точность в своем заявлении о формате, но я не хочу излишне урезать длинные строки. Я просто хочу подавить тренировки 0s.
Я попытался использовать Decimal.normalize(), который работает во всех случаях, кроме случаев, когда e < 2.
>>> print Decimal("1.2000e+4").normalize()
1.2E+4
>>> print Decimal("1.2000e+1").normalize()
12
Так что лучше, если я не хочу 12, я хочу 1.2e + 1.: P
Любые предложения будут очень благодарны!
Edit:
Чтобы уточнить, входное значение уже округлено соответствующим образом до заданной длины, которая теперь неизвестна. Я пытаюсь избежать пересчета соответствующей точности форматирования.
В принципе, я мог бы иметь входные значения "1.23" и "1234.56", которые должны отображаться как "1.23e + 0" и "1.23456e + 3".
Мне может потребоваться просто проверить, как долго вводится строка ввода и использовать это, чтобы указать точность вручную, но я хотел проверить и убедиться, что я просто не пропустил что-то, что могло бы просто предотвратить экспоненциальный формат от произвольного добавления 0s.
Ответы
Ответ 1
Просто возвращаюсь и убираю старые вопросы. Я решил это решить, написав небольшую функцию для интуиции начальной точности числа, а затем используя его для форматирования выходного результата.
#used to determine number of precise digits in a string
def get_precision(str_value):
vals = str_value.split('.')
if (vals[0] == '0'):
return len(vals[1])
else:
return len(str_value) -1
# maintain same precision of incoming string on output text
class ExpDecorator(CurrencyDecorator):
def get_text(self):
text = self.decoratedCurrency.get_text()
return ('{:.' + str(get_precision(text)-1) + 'e}').format(float(text))
Не самое изящное решение, но задача была отвратительной для начала, и она выполнила свою работу.
Ответ 2
Вы можете указать точность в формате:
print '{:.2e}'.format(float(input))
Это всегда даст 2 десятичных значения точности. Количество требуемой точности должно определяться вами самостоятельно. Если вам нужна помощь в этом сообщении в комментариях.
Ответ 3
Потребовалось немного аппроксимирующего решения Alex, но я написал функцию, которая удалит все конечные нули из любого числа в python.
def remove_trailing_zeros(value):
value = str(value)
if value.find('e') != -1:
vals = value.split('e')
e = vals[1]
return '{:g}'.format(float(vals[0]))+'e'+e
vals = value.split('.')
if (vals[0] == '0'):
i = 0
while vals[1][i] == '0':
i += 1
return '{:.{}e}'.format(float(value), len(vals[1][i:]) - 1)
else:
j = len(vals[0]) - 1
while vals[0][j] == '0':
j -= 1
return '{:.{}e}'.format(float(value), len(vals[0][:j]))