2

我有一个函数,旨在将一个数字向下舍入到最接近的偶数。

double round(double d)
{
  floor(d + 0.5);
  if(d % 2 == 1)
  {
      d = d-1;
  }
  return d;
}

但是,当我尝试编译代码时,这会返回错误“表达式必须具有整数或枚举类型”。该错误与 if 语句在同一行报告。

谁能指出我正确的方向?

4

5 回答 5

5

% 运算符只为整数定义。你想使用fmod() 函数

比尔关于正确实施round(double x).

于 2013-06-06T18:11:14.087 回答
2

floor()函数返回一个双精度:

double floor (double x);

这是浮点类型,而不是“整数类型”,例如intor char。而不是调用floor(d + 0.5);which roundsd并丢弃结果,您需要类似的东西:

int i = static_cast<int>(floor(d + 0.5));
于 2013-06-06T18:13:04.217 回答
0
return floor(d/2 + 0.5) * 2;

当然双打是一个近似值。对于 10^50,您可能不会得到偶数。

于 2013-06-06T18:13:21.653 回答
0

floor 不起作用,它返回 floor-ed 值。% 也适用于整数,因此您不能重复使用d. 你想要的是:

  int i = floor(d + 0.5);
  if(i % 2 == 1)
  {
      i = i-1;
  }
  return i;
于 2013-06-06T18:14:40.410 回答
0

这个版本会按照你的要求做,返回一个int.

如果参数d超出 a 的范围int,则返回0
(也许你想抛出一个OutOfRange异常什么的)

int roundDown2Even(double d)
{
    return (INT_MIN <= d && d <= INT_MAX)? ((int)d) & ~1 : 0;
}
于 2013-06-06T18:20:43.523 回答