误差C++舍入数字 - 表达式必须具有整数或枚举类型

Rounding numbers in C++ error - expression must have integral or enum type

本文关键字:整数 类型 枚举 舍入 C++ 数字 表达式 误差      更新时间:2023-10-16

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

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

但是,当我尝试编译代码时,这将返回错误"表达式必须具有整数或枚举类型"。错误是从与 if 语句相同的行报告的。

谁能指出我正确的方向?

%

运算符仅针对整数定义。你想使用 fmod(( 函数。

比尔关于正确实施round(double x)是正确的。

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

double floor (double x);

这是一个浮点类型,而不是像intchar那样的"积分类型"。与其调用floor(d + 0.5);来舍入d并丢弃结果,不如调用以下内容:

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 超出int的范围,则返回 0
(也许你想抛出一个OutOfRange异常或其他东西(

int roundDown2Even(double d)
{
    return (INT_MIN <= d && d <= INT_MAX)? ((int)d) & ~1 : 0;
}