我有一个函数,旨在将一个数字向下舍入到最接近的偶数。
double round(double d)
{
floor(d + 0.5);
if(d % 2 == 1)
{
d = d-1;
}
return d;
}
但是,当我尝试编译代码时,这会返回错误“表达式必须具有整数或枚举类型”。该错误与 if 语句在同一行报告。
谁能指出我正确的方向?
该floor()
函数返回一个双精度:
double floor (double x);
这是浮点类型,而不是“整数类型”,例如int
or char
。而不是调用floor(d + 0.5);
which roundsd
并丢弃结果,您需要类似的东西:
int i = static_cast<int>(floor(d + 0.5));
return floor(d/2 + 0.5) * 2;
当然双打是一个近似值。对于 10^50,您可能不会得到偶数。
floor 不起作用,它返回 floor-ed 值。% 也适用于整数,因此您不能重复使用d
. 你想要的是:
int i = floor(d + 0.5);
if(i % 2 == 1)
{
i = i-1;
}
return i;
这个版本会按照你的要求做,返回一个int
.
如果参数d
超出 a 的范围int
,则返回0
。
(也许你想抛出一个OutOfRange
异常什么的)
int roundDown2Even(double d)
{
return (INT_MIN <= d && d <= INT_MAX)? ((int)d) & ~1 : 0;
}