2015-06-01 2 views
0

Я пробовал это в Python2, Python3 и C:Почему% e ведет себя иначе, чем% g в строках формата?

Почему эти строки формата возвращают номера с различной точностью?

>>> "%.3e" % 123456789 
'1.235e+08' 
>>> "%.3g" % 123456789 
'1.23e+08' 
+1

Потому что они разные? Изучив ответы, я озадачен тем, почему OP думает, что две разные спецификации формата, которые ведут себя так, как предполагалось, но разные, должны быть одинаковыми. –

ответ

3

Из документации питона:

'е' Экспонент обозначения. Печатает номер в научной нотации, используя букву «e», чтобы указать экспонента. Точность по умолчанию 6.


'г'
Общий формат. Для заданной точности p> = 1 это округляет число до p значительных цифр, а затем форматирует результат как в формате фиксированной точки, так и в научной нотации в зависимости от ее величины.

Точные правила заключаются в следующем: предположим, что результат, отформатированный с типом представления «e» и точностью p-1, будет иметь показатель exp. Тогда, если -4 < = exp < p, число отформатировано с типом представления 'f' и точностью p-1-exp. В противном случае число будет отформатировано с типом представления 'e' и точностью p-1. В обоих случаях несущественные конечные нули удаляются из значения, а десятичная точка также удаляется, если после нее не осталось оставшихся цифр.

Положительная и отрицательная бесконечность, положительный и отрицательный ноль и nans, отформатированы как inf, -inf, 0, -0 и nan соответственно, независимо от точности.

Прецизионный 0 трактуется как эквивалент точности 1. Точность по умолчанию равно 6.

С альтернативных значений:

>>> "%.3e" % 123 
'1.230e+02' 
>>> "%.3g" % 123 
'123' 
>>> "%.3e" % 1234 
'1.234e+03' 
>>> "%.3g" % 1234 
'1.23e+03' 

разница, то, очевидно, о том, как точность . g, по-видимому, использует точность как обычное определение точности, тогда как e использует число цифр после десятичной точки.

+0

Ваш ответ будет улучшен путем предоставления ссылки на цитируемые документы. –

+0

Это показывает, что поведение предназначено. Но почему? – steffen

+0

@StevenRumbalski Это было бы, но обычно политика SO должна давать ответ, где это возможно, а не ссылку. Я предполагаю, что это произойдет, если ссылка изменится. –

1

От printf(3) man page:

е, Е

Двойной аргумент округляется и преобразуется в стиле [-] d.ddde ± дд, где есть одна цифра перед символом десятичной точки и количество цифр после того, как оно равно точности; если точность отсутствует, она принимается равной 6; если точность равна нулю, символ десятичной точки не появляется. Преобразование E использует букву E (а не e), чтобы ввести показатель степени. Показатель всегда содержит не менее двух цифр; если значение равно нулю, то показатель степени равен 00.

...

G, G

Двойной аргумент преобразуется в стиле F или Е (или F или E для преобразования G). Точность определяет количество значащих цифр. Если точность отсутствует, указывается 6 цифр; если точность равна нулю, ее обрабатывают как 1. Стиль e используется, если показатель степени его конверсии меньше -4 или больше или равен точности. Конечные нули удаляются из дробной части результата; десятичная точка появляется только в том случае, если за ней следует хотя бы одна цифра.

Таким образом, они выполняют разные вещи даже с той же точностью.

+0

Это показывает, что поведение предназначено. Но почему? – steffen

+2

... Вы хотите, чтобы я рассказал вам, почему дизайнеры BCPL сделали то, что они сделали? Извините, не психический. –

+0

Да, мой вопрос был почему. Я думал, может быть, есть очевидное преимущество, которого я не вижу ... – steffen

Смежные вопросы