Другие люди ответили на общий вопрос, поэтому я не видел необходимости повторять его. Я просто предлагал полезное предложение.
цификатор, похоже, не ведет себя так, как большинство источников документирует его как поведение.%g
Согласно большинству источников, которые я нашел, на нескольких языках, которые используют
спецификаторыprintf
спецификатор должен быть эквивалентен либо%g
или же%f
- в зависимости от того, что приведет к более короткому результату для предоставленного значения. Например, на момент написания этого вопроса,%e
cplusplus.com говорит что спецификатор означает:g
Используйте самое короткое представление:
или же%e
И%f
Руководство по PHP говорит это значит:г - короче
% е а также% еА также.
вот ответ переполнения стека что утверждает, что использует кратчайшее представление.
%g
А также
ответ Quora что утверждает, что: печатает число в самом коротком из этих двух представлений
%g
Но это поведение не то, что я вижу в реальности. Если я скомпилирую и ru, n этой программы (как C или C ++ - это допустимая программа с одинаковым поведением в обоих):
... тогда я вижу этот вывод:
#include <stdio.h>
int main(void) {
double x = 123456.0;
printf("%e\n", x);
printf("%f\n", x);
printf("%g\n", x);
printf("\n");
double y = 1234567.0;
printf("%e\n", y);
printf("%f\n", y);
printf("%g\n", y);
return 0;
}
Очевидно, что
1.234560e+05
123456.000000
123456
1.234567e+06
1234567.000000
1.23457e+06
вывод не совсем совпадает%g
или или же%e
выход для любого%f
или жеx
выше. Более того, это не похоже наy
минимизирует выходную длину либо;%g
мог бы быть отформатирован более кратко, если, какy
это былоx
не был напечатан в научной записи.Все ли источники, которые я цитировал выше, лгут мне?
Я вижу идентичное или похожее поведение в других языках, которые поддерживают эти спецификаторы формата, возможно потому, что они скрытно обращаются к
семейство С функций. Например, я вижу этот вывод в Python:printf
В PHP:
>>> print('%g' % 123456.0)
123456
>>> print('%g' % 1234567.0)
1.23457e+06
В рубине:
php > printf('%g', 123456.0);
123456
php > printf('%g', 1234567.0);
1.23457e+6
Какая логика управляет этим выводом?
irb(main):024:0* printf("%g\n", 123456.0)
123456
=> nil
irb(main):025:0> printf("%g\n", 1234567.0)
1.23457e+06
=> nil
Это полное описание