【问题标题】:Rounding numbers in C++ error - expression must have integral or enum type [duplicate]C ++错误中的舍入数字 - 表达式必须具有整数或枚举类型[重复]
【发布时间】:2013-06-06 18:09:11
【问题描述】:

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

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

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

谁能指出我正确的方向?

【问题讨论】:

  • 你不能在双精度上使用%(在 C++ 中)
  • 另外,floor(d + 0.5); 行没有任何作用。
  • 除了@interjay 所说的,它确实做了一些事情——它返回一个值,你默默地扔掉了它。您需要将结果分配给变量。
  • 对于输入 1(0、2 或其中之一?)、3(2、4 或其中之一?)、–1(0、–2 或任何一个或任何一个),您想要什么结果 [将不会被使用]) 和 –3(–2、–4 或者任何一个?)?

标签: c++ enums


【解决方案1】:

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

Bill is right 关于round(double x) 的正确实现。

【讨论】:

    【解决方案2】:

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

    double floor (double x);
    

    这是一种浮点类型,而不是“整数类型”,例如intchar。而不是调用 floor(d + 0.5); 来舍入 d 并丢弃结果,您需要类似:

    int i = static_cast<int>(floor(d + 0.5));
    

    【讨论】:

    • 为什么这是公认的答案?该问题要求代码向下舍入为偶数。这既不向下舍入也不舍入到偶数(当奇数更接近时)。问题写错了吗?
    • 问的问题,However, this returns the error 'expression must have integral or enum type' when I try to compile the code. The error is reported from the same line as the if statement。我试图解释为什么会出现这个特定错误,以及可以做些什么来修复它。
    【解决方案3】:
    return floor(d/2 + 0.5) * 2;
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        如果参数d 超出int 的范围,则返回0
        (也许你想抛出一个OutOfRange 异常或其他东西)

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多