Другие люди ответили на общий вопрос, поэтому я не видел необходимости повторять его. Я просто предлагал полезное предложение.

цификатор, похоже, не ведет себя так, как большинство источников документирует его как поведение.%gСогласно большинству источников, которые я нашел, на нескольких языках, которые используют

 спецификаторыprintf спецификатор должен быть эквивалентен либо%g или же%f - в зависимости от того, что приведет к более короткому результату для предоставленного значения. Например, на момент написания этого вопроса,%ecplusplus.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

Это полное описание

Ответы на вопрос(1)

Ваш ответ на вопрос