Я пробовал это в Python2, Python3 и C:Почему% e ведет себя иначе, чем% g в строках формата?
Почему эти строки формата возвращают номера с различной точностью?
>>> "%.3e" % 123456789
'1.235e+08'
>>> "%.3g" % 123456789
'1.23e+08'
Я пробовал это в Python2, Python3 и C:Почему% e ведет себя иначе, чем% g в строках формата?
Почему эти строки формата возвращают номера с различной точностью?
>>> "%.3e" % 123456789
'1.235e+08'
>>> "%.3g" % 123456789
'1.23e+08'
Из документации питона:
'е' Экспонент обозначения. Печатает номер в научной нотации, используя букву «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
использует число цифр после десятичной точки.
Ваш ответ будет улучшен путем предоставления ссылки на цитируемые документы. –
Это показывает, что поведение предназначено. Но почему? – steffen
@StevenRumbalski Это было бы, но обычно политика SO должна давать ответ, где это возможно, а не ссылку. Я предполагаю, что это произойдет, если ссылка изменится. –
е, Е
Двойной аргумент округляется и преобразуется в стиле [-] d.ddde ± дд, где есть одна цифра перед символом десятичной точки и количество цифр после того, как оно равно точности; если точность отсутствует, она принимается равной 6; если точность равна нулю, символ десятичной точки не появляется. Преобразование E использует букву E (а не e), чтобы ввести показатель степени. Показатель всегда содержит не менее двух цифр; если значение равно нулю, то показатель степени равен 00.
...
G, G
Двойной аргумент преобразуется в стиле F или Е (или F или E для преобразования G). Точность определяет количество значащих цифр. Если точность отсутствует, указывается 6 цифр; если точность равна нулю, ее обрабатывают как 1. Стиль e используется, если показатель степени его конверсии меньше -4 или больше или равен точности. Конечные нули удаляются из дробной части результата; десятичная точка появляется только в том случае, если за ней следует хотя бы одна цифра.
Таким образом, они выполняют разные вещи даже с той же точностью.
Это показывает, что поведение предназначено. Но почему? – steffen
... Вы хотите, чтобы я рассказал вам, почему дизайнеры BCPL сделали то, что они сделали? Извините, не психический. –
Да, мой вопрос был почему. Я думал, может быть, есть очевидное преимущество, которого я не вижу ... – steffen
Потому что они разные? Изучив ответы, я озадачен тем, почему OP думает, что две разные спецификации формата, которые ведут себя так, как предполагалось, но разные, должны быть одинаковыми. –