Существует ли функция к раунду плавание в C, или я должен записать свое собственное?

r'\bTimestamp\s+([0-9]+)\s+ID=(\w{18})\s+Dest_ID=(\w{18})\s+(\w{12})'
24
задан mskfisher 15 May 2012 в 14:01
поделиться

4 ответа

Как Rob упомянул, Вы, вероятно, просто хотите к печать плавание к 1 десятичному разряду. В этом случае можно сделать что-то как следующее:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  float conver = 45.592346543;
  printf("conver is %0.1f\n",conver);
  return 0;
}

, Если Вы хотите к на самом деле круглому хранимую сумму, это немного более сложно. Для одного Ваше представление с одним десятичным разрядом будет редко иметь точный аналог в с плавающей точкой. Если Вы просто хотите стать максимально близкими, что-то вроде этого могло бы добиться цели:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
  float conver = 45.592346543;
  printf("conver is %0.1f\n",conver);

  conver = conver*10.0f;
  conver = (conver > (floor(conver)+0.5f)) ? ceil(conver) : floor(conver);
  conver = conver/10.0f;

  //If you're using C99 or better, rather than ANSI C/C89/C90, the following will also work.
  //conver = roundf(conver*10.0f)/10.0f;

  printf("conver is now %f\n",conver);
  return 0;
}

я сомневаюсь, что этот второй пример - то, что Вы ищете, но я включал его для полноты. Если Вы действительно требуете, чтобы представление Ваших чисел таким образом внутренне, и не только на выводе, рассмотрело использование представление фиксированной точки вместо этого.

29
ответ дан Matt J 28 November 2019 в 22:43
поделиться

Конечно, вы можете использовать roundf () . Если вы хотите округлить до одного десятичного знака, то вы можете сделать что-то вроде: roundf(10 * x) / 10

28
ответ дан Eduard - Gabriel Munteanu 28 November 2019 в 22:43
поделиться
#include <math.h>

double round(double x);
float roundf(float x);

не забывают связываться с-lm. См. также перекрывают (), пол () и trunc ().

2
ответ дан Nathan Campos 28 November 2019 в 22:43
поделиться

Только для обобщения ответа Rob немного, если Вы не выполнение его на выводе, можно все еще использовать тот же интерфейс с sprintf().

я думаю, что существует другой способ сделать это, все же. Можно попробовать ceil() и floor() к раунду вверх и вниз. Хороший прием должен добавить 0.5, таким образом, что-либо, что более чем 0,5 окружают, но что-либо под ним округляет в меньшую сторону. ceil() и floor() только работа над double с все же.

РЕДАКТИРОВАНИЕ: Кроме того, для плаваний можно использовать truncf() для усечения плаваний. Те же +0.5 приема должны работать, чтобы сделать точное округление.

1
ответ дан Chris Lutz 28 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

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