Избегайте конечных нулей в printf () - PullRequest
100 голосов
/ 10 ноября 2008

Я спотыкаюсь о спецификаторах формата для семейства функций printf (). Что я хочу - это иметь возможность печатать двойное число (или число с плавающей запятой) с максимальным заданным количеством цифр после десятичной точки Если я использую:

printf("%1.3f", 359.01335);
printf("%1.3f", 359.00999);

Я получаю

359.013
359.010

Вместо желаемого

359.013
359.01

Кто-нибудь может мне помочь?

Ответы [ 12 ]

0 голосов
/ 01 февраля 2010

Небольшое изменение на выше:

  1. Исключает период для дела (10000.0).
  2. Перерывы после обработки первого периода.

Код здесь:

void EliminateTrailingFloatZeros(char *iValue)
{
  char *p = 0;
  for(p=iValue; *p; ++p) {
    if('.' == *p) {
      while(*++p);
      while('0'==*--p) *p = '\0';
      if(*p == '.') *p = '\0';
      break;
    }
  }
}

У него все еще есть потенциал для переполнения, поэтому будьте осторожны; P

0 голосов
/ 10 ноября 2008

Вот моя первая попытка ответа:

void
xprintfloat(char *format, float f)
{
  char s[50];
  char *p;

  sprintf(s, format, f);
  for(p=s; *p; ++p)
    if('.' == *p) {
      while(*++p);
      while('0'==*--p) *p = '\0';
    }
  printf("%s", s);
}

Известные ошибки: возможное переполнение буфера в зависимости от формата. Если "." присутствует по другой причине, чем% f может произойти неправильный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...