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
Благодаря Joach, това е, което търся. - 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