Квитирование: Этот подход не с определенными номерами с определенной шириной спецификацией, как это указано в комментариях.
Одна вещь, которую вы могли бы сделать это, чтобы вычислить количество цифр до десятичной точки, а затем использовать printf
Precision Specification укоротить цифры, которые сделали бы число слишком долго.
Вы можете создать пользовательскую функцию, принимая FILE
указатель для использования с fprintf
, float
nubmer, который вы хотите напечатать и нужное количество символов, которые вы хотите иметь; 3 аргумента.
Следующее, что вам нужно сделать, это определить количество цифр до десятичной точки. Имея новую переменную int
и положив в нее float
, разделите ее на int
на 10
s, пока она не станет нулевой. Но будьте осторожны, 0.0
также имеет одну цифру до десятичной точки, хотя ее оценка int
не отображает ее.
Тогда все, что вам нужно сделать, это уменьшить ширину, получаемую количеством цифр до десятичной точки, плюс 1 для самой десятичной точки (или, скорее, минус в этом случае), и это будет ваше Прецизионная спецификация для fprintf
, которую вы будете использовать.
Таким образом, в конце концов, ваш fprintf
должен выглядеть примерно так с этим методом:
fprintf(fp, "%.*f", Width - digitsbeforeDpoint - 1);
Вот пример того, что я сделал, работая, насколько я могу проверить. Он также имеет некоторые дополнительные меры предосторожности, чтобы убедиться, что каждый вход является разумным и уверяя, что поплавок дается квалифицирован, чтобы распечатать количество цифр вы желаете:
#include <stdio.h>
void fixdLengthfprintf(FILE * _File, float a, int width) {
if (!_File) return;
if (width < 3) return;
int b = a;
do {
width--;
b /= 10;
} while (b);
width--;
if (width > 0) fprintf(_File, "%.*f\n", width, a);
}
int main() {
float numbers[7] = { // prints as:
1.123456, // 1.123456
12.1234567, // 12.12346 (apparently rounded)
123456., // 123456.0 (heavily rounded)
1234567., // doesn't get printed
12345678., // doesn't get printed
123456789., // doesn't get printed
0.123456789, // 0.123457
};
// I don't allow them to get printed because else they'd look like:
// 1.123456
// 12.12346
// 123456.0
// 1234567
// 12345678.000000
// 123456792.000000
// 0.123457
for (int i = 0; i < 7; i++) fixdLengthfprintf(stdout, numbers[i], 8);
fflush(stdin);
getchar();
return 0;
}
Можете ли вы предоставить нам лучший пример того, что вы хотите? – JMBise
Переформатирование вашего вопроса (включая кавычки) для показа желаемого макета может помочь прояснить ваш запрос и, таким образом, получить помощь. –
Не может быть единой спецификации формата, которая может делать то, что вы хотите, поэтому вам может потребоваться выбрать во время выполнения из нескольких альтернатив в зависимости от значения, которое будет напечатано. Я думаю, что '% .7g' для чисел> = 1.0 и'% 5f' для чисел <= 1.0 будет делать то, что вы хотите. –