Если вы используете %f
точно так, как указано, это на самом деле нарушает стандарт (это было бы необычно, но, конечно, не случайно), который гласит: C11 7.21.6.1 The fprintf function /8
:
F, f: A double
аргумент, представляющий число с плавающей запятой, преобразуется в десятичную запись в стиле [−]ddd.ddd
, где число цифр после символа десятичной запятой равно к спецификации точности. Если точность отсутствует, она принимается как 6
.
Другими словами, эта программа:
#include <stdio.h>
int main() {
double d1 = 11312.96, d2 = 11313.1;
printf("%f\n%f\n", d1, d2);
return 0;
}
должна сгенерировать:
11312.960000
11313.100000
Если вы хотите, чтобы имел другой формат (как в вашем, казалось бы, некорректном случае, так и в случае, соответствующем стандарту), используйте аргумент точности, чтобы принудительно вызвать его, например, с помощью:
printf("%.2f\n", d1); // gives "11312.96"
Вы также можете указать минимальную ширину поля, чтобы убедиться, что ваши номера выстроены справа, например:
// posn: 123456789
// ---------
printf("%9.2f\n", d1); // gives " 11312.96"
printf("%9.2f\n", 3.1); // gives " 3.10"