Формат "%f" является корректным форматом (или хотя бы одним из корректных форматов) для печати значений плавающей запятой двойной точности (т. е. типа double). Не существует специального формата для чисел плавающей запятой одинарной точности (т. е. типа float), потому что если вы попытаетесь передать значение float для печати в printf (или в sprintf), то оно будет интерпретироваться как double перед обработкой формата. Формат "%lf" для вывода также допускается текущим стандартом, хотя указание l не дает никакого эффекта, если за ним идет спецификатор f.
По умолчанию printf (sprintf) при выводе чисел с плавающей запятой либо выводит после запятой только значащие цифры, либо производит округление до заданного количества цифр (зависит от реализации библиотеки libc; например SDK ESP-IDF производит округление до 6 цифр после запятой). Если необходимо печатать большее количество знаков после запятой, то используйте формат "%.nf", где n задает количество цифр после запятой. Пример:
double fK = 0.999828; sprintf(paramstr, "%.10f", fK); // paramstr == "0.9998280000"
Обратите внимание, что это одно из мест, где строки формата printf существенно отличаются от строк формата scanf (sscanf, fscanf, и т. п.). Для случая вывода (printf, sprintf) вы передаете значение, которое преобразуется из float в double, когда передается как переменный параметр в функцию печати. Для ввода (scanf, sscanf, и т. п.) вы передаете указатель на модифицируемую переменную, и в этом случае преобразования типа не происходит, поэтому вам необходимо явно указать для scanf, какое конкретно число вы хотите прочитать, float или double. При этом %f будет означать, что вы хотите прочитать float, а %lf означает, что вы хотите прочитать double. И если погружаться дальше, то для long double вы используете %Lf для printf или scanf. Пример чтения числа double из строки tmpstr:
double fK; int scanresult = sscanf(tmpstr, "%lf", &fK); if (1 != scanresult)
{
// Ошибка
...
[Ссылки]
1. Correct format specifier for double in printf site:stackoverflow.com. 2. Секреты printf. 3. IAR EWB ARM: форматированный вывод printf библиотеки DLIB. |