我对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;
}
在我的测试中,这个功能显然不稳定。这里有冗余吗?嗯......我不只是寻找答案,而是更好地理解这个问题。
答案 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标准起可用。