误差C++舍入数字 - 表达式必须具有整数或枚举类型
Rounding numbers in C++ error - expression must have integral or enum type
我有一个函数,旨在将数字向下舍入到最接近的偶数。
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);
这是一个浮点类型,而不是像int
或char
那样的"积分类型"。与其调用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;
}
相关文章:
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 涉及旧式枚举和整数类型的重载解析
- 将字符串转换为整数类型T,检查是否存在溢出
- 整数文本太大,无法用任何整数类型表示--C++
- isdigit(c) - 字符或整数类型?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- C++模板专用化 - 将其他整数类型委托给uint64_t
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 根据浮点数选择最小整数类型
- 为什么 QVariant 将字符类型视为整数类型
- 我们可以在整数类型的双指针中分配2D整数数组的地址吗?怎么可能
- 默认情况下,决定整数类型是唱歌或无符号的类型
- 是否可以根据类型是整数类型还是浮点类型重载模板函数
- 使用固定整数类型的安全性
- 如何使用条件来检查类型名 T 是否是 C++ 中浮点类型的整数类型
- C++文本整数类型
- 哪种整数类型可以安全且便携式用于始终保持指针值
- 检测整数类型变量上的空白输入
- 为什么对Chrono :: Nanseconds的表示类型是签名的整数类型
- 如何处理警告:从较小的整数类型int转换为int*