Нормализация точности Python Scientific Notation - PullRequest
19 голосов
/ 07 апреля 2011

Моя цель - просто преобразовать строку типа «1.2» в научную нотацию без дополнительной точности.Проблема в том, что у меня всегда заканчиваются лишние 0 в конце моего вывода.

>>> input = "1.2"
>>> print '{:e}'.format(float(input))
1.200000e+00

Я пытаюсь выяснить, как получить просто 1.2e+00.Я понимаю, что могу указать точность в своем утверждении формата, но я не хочу без необходимости обрезать более длинные строки.Я просто хочу подавить тренировку 0s.

Я пытался использовать Decimal.normalize (), который работает во всех случаях, кроме случаев, когда e <2. </p>

>>> print Decimal("1.2000e+4").normalize()
1.2E+4
>>> print Decimal("1.2000e+1").normalize()
12

Так что лучшеЗа исключением того, что я не хочу 12, я хочу 1.2e + 1.: P

Будем весьма благодарны за любые предложения!

Редактировать: Чтобы уточнить, входное значение уже было округлено до заданной длины, которая теперь неизвестна.Я пытаюсь избежать пересчета соответствующей точности форматирования.

По сути, у меня могут быть входные значения "1.23" и "1234.56", которые должны быть "1.23e + 0" и "1.23456e + 3".

У меня может бытьпросто проверить, какова длина входной строки, и использовать ее для указания точности вручную, но я хотел проверить и убедиться, что я просто не пропустил что-то, что могло бы просто предотвратить случайное добавление 0 в экспоненциальном формате.

Ответы [ 3 ]

35 голосов
/ 07 апреля 2011

Вы можете указать точность в формате:

print '{:.2e}'.format(float(input))

Это всегда даст 2 десятичных знака точности.Степень точности, которую вы хотите, должна быть определена вами.Если вам нужна помощь с этим постом в комментариях.

7 голосов
/ 23 мая 2011

Просто возвращаюсь и убираю старые вопросы.В итоге я решил эту проблему, написав небольшую функцию для интуитивной начальной точности числа, а затем использовал ее для форматирования выходного результата.

#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))

Не совсем элегантное решение, но задача была своего роданеприятно для начала, и он сделал свою работу.

0 голосов
/ 05 декабря 2015

Потребовалось немного доработать решение Алекса, но я написал функцию, которая удаляла бы все завершающие нули из любого числа в 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]))
...