Printf переменная количество десятичных знаков в float

Я нашел интересный формат для печати незавершенных строк фиксированной длины, например:

char newstr[40] = {0};
sprintf(newstr,"%.*s",  sizeof(mystr), mystr);

Итак, я думаю, может быть, есть способ под командой printf распечатать число с плавающей запятой...

%8.2f

чтобы иметь возможность выбрать количество знаков после запятой с целым числом.

Что-то вроде этого:

sprintf(mystr, "%d %f", numberofdecimals, floatnumbervalue)

person Wine Too    schedule 07.05.2013    source источник
comment
УДАЛЕНО: РЕДАКТИРОВАТЬ - Решение: (для округления и очистки числа с плавающей запятой до желаемой точности). c int precision = 2; char kolf[16] = {0}; sprintf(kolf, "%8.*f", precision, mystruct.myfloat); float kol = atof(kolf);   -  person Wolf    schedule 12.01.2021


Ответы (3)


Вы также можете использовать ".*" с плавающей запятой, см. также http://www.cplusplus.com/reference/cstdio/printf/ (относится к C++, но спецификаторы формата аналогичны)

.number: для спецификаторов a, A, e, E, f и F: это количество цифр, которое должно быть напечатано после запятой (по умолчанию это 6).

...

.*: точность указывается не в строке формата, а как дополнительный целочисленный аргумент, предшествующий форматируемому аргументу.

Например:

float floatnumbervalue = 42.3456;
int numberofdecimals = 2;
printf("%.*f", numberofdecimals, floatnumbervalue);

Выход:

42.35
person Andreas Fester    schedule 07.05.2013

Вы также можете использовать звездочку для этого, как для ширины поля, так и для точности:

printf("%*.*f\n", myFieldWidth, myPrecision, myFloatValue);

См., например. эту ссылку.

person Some programmer dude    schedule 07.05.2013
comment
Спасибо, Джоак, это то, что я ищу. - person Wine Too; 07.05.2013
comment
+1 за ссылку на часть C en.cppreference.com - в закладки :) - person Andreas Fester; 07.05.2013

Если по какой-то причине ваша фактическая библиотека C не поддерживает переменную точность и ширину для форматирования с плавающей запятой, не так уж сложно создать собственную строку формата:

char fmt[6 + 3*(sizeof width + sizeof precision)]; /* sufficient space */
sprintf(fmt, "%%%d.%df\n", width, precision);
printf(fmt, value);

Конечно, это дорого обходится, но — в зависимости от вашей ситуации — это может быть централизовано.

person Wolf    schedule 12.01.2021