Я должен распечатать числа с плавающей точкой со следующими требованиями форматирования:
5.12345
должен отобразиться только 5.1
5.0
если только 5
(без .0
)
5.0176
должен отобразиться только 5
(без .01
)
Я думал printf()
мог сделать что-то вроде этого..., но теперь я, может казаться, не заставляю это работать.
Вы можете получить результат, близкий к желаемому, используя "% g"
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("%.6g\n", 5.12345f);
printf("%.6g\n", 5.0f);
printf("%.6g\n", 5.0176f);
return 0;
}
Вывод:
5.12345
5
5.0176
"% g "удалит завершающие нули.
Похоже, вы хотите вывести 1 десятичный знак, а если это место равно 0, отпустите его. Эта функция должна работать нормально:
// prints the float into dst, returns the number
// of chars in the manner of snprintf. A truncated
// output due to size limit is not altered.
// A \0 is always appended.
int printit(float f, char *dst, int max) {
int c = snprintf(dst, max, "%.1f", f);
if(c > max) {
return c;
}
// position prior to '\0'
c--;
while(dst[c] == '0') {
c--;
if(dst[c] == '.') {
c--;
break;
}
}
dst[c + 1] = '\0';
return c + 1;
}
int main(void) {
char num1[10], num2[10], num3[10];
printit(5.12345f, num1, 10);
printit(5.0f, num2, 10);
printit(5.0176f, num3, 10);
printf("%s\n%s\n%s\n", num1, num2, num3);
}
printf () может использовать строки форматирования. Посмотрите на параметры ширины и точности строк форматирования:
printf("%.1f", 5.12345f);
Будет напечатано 5.1
.
К сожалению, у него нет возможности автоматически определять, что отображать, без указаний. (Например, ваш последний вариант мне непонятен - почему он должен опускать «.0176», если вы не говорите, что не хотите никаких десятичных знаков?)
Не так, как вы это описали, нет. Если вам нужны условные десятичные разряды, вы должны сделать это сами.
я давно не играл с форматами printf, но, похоже, в большинстве случаев это работает
char *BuildConditionalFormat(double val)
{
int tenths = (int)(val * 10) % 10;
if (tenths == 0)
return ".0f";
return ".1f";
}
/* test rig */
float f = 5.0;
printf(BuildConditionalFormat(f), f); /* -> 5 */
f = 5.13;
printf("\n");
printf(BuildConditionalFormat(f), f); /* -> 5.1 */
printf("\n");
Это соответствует вашим правилам, но также даст интересный урок о том, почему с плавающей запятой воняет, потому что 5.1 -> 5 . Почему? Поскольку 5.1 не представляет чисто (на моей машине) как float - это 5.09999 и еще несколько изменений.
Скорее всего, вам также нужно узнать о floor () и ceil () ...
Ни один из операторов форматирования не поддерживает это, однако вы можете сначала отфильтровать float
через sprintf ()
, а затем обрезать строку там, где это необходимо. Это избавит вас от необходимости преобразовывать число с плавающей запятой в строку, а логика, позволяющая сделать все остальное, проста.
Вы можете указать printf печатать указанное количество цифр после '.' , но если вы хотите изменить формат в зависимости от значения, вам нужно написать код, чтобы выделять интересующие вас случаи.