Получение printf () для отбрасывания запаздывания “.0” из значений

Я должен распечатать числа с плавающей точкой со следующими требованиями форматирования:

  • 5.12345 должен отобразиться только 5.1

  • 5.0 если только 5 (без .0)

  • 5.0176 должен отобразиться только 5 (без .01)

Я думал printf() мог сделать что-то вроде этого..., но теперь я, может казаться, не заставляю это работать.

5
задан iHunter 9 February 2012 в 10:19
поделиться

6 ответов

Вы можете получить результат, близкий к желаемому, используя "% 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 "удалит завершающие нули.

8
ответ дан 18 December 2019 в 14:44
поделиться

Похоже, вы хотите вывести 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);
}
2
ответ дан 18 December 2019 в 14:44
поделиться

printf () может использовать строки форматирования. Посмотрите на параметры ширины и точности строк форматирования:

printf("%.1f", 5.12345f);

Будет напечатано 5.1 .

К сожалению, у него нет возможности автоматически определять, что отображать, без указаний. (Например, ваш последний вариант мне непонятен - почему он должен опускать «.0176», если вы не говорите, что не хотите никаких десятичных знаков?)

1
ответ дан 18 December 2019 в 14:44
поделиться

Не так, как вы это описали, нет. Если вам нужны условные десятичные разряды, вы должны сделать это сами.

я давно не играл с форматами 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 () ...

1
ответ дан 18 December 2019 в 14:44
поделиться

Ни один из операторов форматирования не поддерживает это, однако вы можете сначала отфильтровать float через sprintf () , а затем обрезать строку там, где это необходимо. Это избавит вас от необходимости преобразовывать число с плавающей запятой в строку, а логика, позволяющая сделать все остальное, проста.

1
ответ дан 18 December 2019 в 14:44
поделиться

Вы можете указать printf печатать указанное количество цифр после '.' , но если вы хотите изменить формат в зависимости от значения, вам нужно написать код, чтобы выделять интересующие вас случаи.

0
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: