在c中使用round()函数

时间:2016-08-25 15:43:39

标签: c rounding

我对C中的round()函数感到有点困惑。

首先,男人说:

SYNOPSIS
   #include <math.h>
   double round(double x);

RETURN VALUE
   These functions return the rounded integer value.
   If x is integral, +0, -0, NaN, or infinite, x itself is returned.

返回值是double / float还是int

第二,我创建了一个第一轮的函数,然后转换为int。后来我的代码我用它作为比较双打

的意思
int tointn(double in,int n)
{
    int i = 0;
    i = (int)round(in*pow(10,n));
    return i;
}

在我的测试中,这个功能显然不稳定。这里有冗余吗?嗯......我不只是寻找答案,而是更好地理解这个问题。

3 个答案:

答案 0 :(得分:5)

手册页中的措辞意味着按字面意思阅读,这是数学意义上的。措词&#34; x是完整的&#34;表示 x Z 的元素,而不是 x 的数据类型为int

double转换为int可能会有危险,因为double可以容纳的最大任意整数值为2 ^ 52(假设符合IEEE 754标准的二进制64),最大值为int可以保持可能更小(在32位体系结构上大多为32位,在某些64位体系结构上 32位)。

如果你只需要10级的力量,你可以自己用这个小程序测试它:

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

int main(){
  int i;
  for(i = 0;i < 26;i++){
    printf("%d:\t%.2f\t%d\n",i, pow(10,i), (int)pow(10,i));
  }
  exit(EXIT_SUCCESS);
}

您应该使用返回正确的整数数据类型的函数,例如:lround(3),而不是强制转换。

答案 1 :(得分:3)

这是摘自手册页。

   #include <math.h>

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

注意:返回的值永远不是整数。但是,返回值的小数部分设置为0.

注意:具体取决于调用哪个函数将决定返回值的类型。

以下是手册页中有关舍入将采用哪种方式的摘录:

   These functions round x to the nearest integer, but round halfway cases
   away  from  zero  (regardless  of  the  current rounding direction, see
   fenv(3)), instead of to the nearest even integer like rint(3).

   For example, round(0.5) is 1.0, and round(-0.5) is -1.0.

答案 2 :(得分:0)

如果要返回整数,请使用lround

long int tolongint(double in)
{
    return lround(in));
}

有关详细信息,请参见lround,该版本自C ++ 11标准起可用。