Почему printf () с% f теряет di git после десятичной точки? - PullRequest
1 голос
/ 17 марта 2020

Почему оператор

printf("%f", sensorvalue)

большую часть времени выводит строку типа «11312.96» (с двумя цифрами после десятичной точки), но иногда выводит строку типа «11313.1» (с одним ди git после запятой)? sensorvalue считывается с измерителя мощности постоянно. Предполагается, что значения в разное время имеют одинаковый формат.

Он C работает на Linux.

Ответы [ 2 ]

3 голосов
/ 17 марта 2020

Почему оператор printf("%f", sensorvalue) печатает строку как 11312.96 (с двумя цифрами после десятичной точки) в большинстве случаев, но иногда печатает строку как 11313.1 (с одним di git после десятичной точки)?

Библиотека просто не C совместима, даже если "Она C работает на Linux."

Вывод

printf("%f\n", 11312.96f);
printf("%f\n", 11312.96);
printf("%f\n", 11313.1f);
printf("%f\n", 11313.1);

... ожидается, что будет как ниже с 6 цифрами после '.' - возможно, с некоторым изменением значений наименьших цифр. Даже с реализациями различного качества, результат должен быть 6 цифр после '.'.

11312.959961
11312.960000
11313.099609
11313.100000

Если бы формат был "%g", мог бы получиться вывод, подобный приведенному ниже.

11313
11313
11313.1
11313.1
2 голосов
/ 17 марта 2020

Если вы используете %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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...