将整数舍入到另一个整数的最接近的倍数
Rounding integer to nearest multiple of another integer
我需要将整数舍入为另一个整数的最接近的倍数。100 倍数情况下的结果示例:
- 36->0
- 99->100
- 123->100
- 164->200
等等。
我想出了以下代码,它可以工作,但感觉"脏":
int RoundToMultiple(int toRound, int multiple)
{
return (toRound + (multiple / 2)) / multiple * multiple;
}
这依靠整数除法的截断属性来使其工作。我可以指望此代码是可移植的吗?是否有任何编译器设置无法为我提供所需的结果?如果有,我怎样才能以便携式方式获得相同的结果?
如果需要更好的答案,可以假设倍数将是 10 的幂(包括 1 的倍数(。数字也可以假设都是正数。
是的,您可以指望此代码是可移植的。 N4296(这是C++14的最新开放草案(在第5.6节[expr.mul]中说:
为 积分操作数/运算符产生代数商,丢弃任何小数部分。 [脚注:这通常称为朝零截断]
这不是最新C++的新功能,也可以在 C89 中依赖。
唯一需要注意的是,如果toRound
为负数,则需要减去偏移量。
另一种方法是:
int RoundToMultiple(int toRound, int multiple)
{
const auto ratio = static_cast<double>(toRound) / multiple;
const auto iratio = std::lround(ratio);
return iratio * multiple;
}
这样可以避免混乱的 +/- 偏移,但性能会更差,如果toRound
太大以至于无法精确地保持在双精度中,则会出现问题。 (OTOH,如果这是为了输出,那么我怀疑在这种情况下multiple
会同样大,所以你会没事的。
C++ 标准明确指定了整数除法的行为:
[扩展]
对于积分操作数,/运算符产生代数 丢弃任何小数部分的商。
又名截断为零。这是便携式的。
正如其他人提到的 - 积分除法的行为符合您的预期,可能是以下解决方案看起来"不太有线"(仍然基于意见(。
关于将 int 转换为双精度的解决方案:我个人觉得这只是为了四舍五入而昂贵,但也许有人可以说服我我的感觉是错误的;
无论如何,通过仅使用积分算子,下面的解决方案使得关于double
尾数是否总是可以容纳所有int
的讨论变得多余:
int RoundToMultiple(int toRound, int multiple) {
toRound += multiple / 2;
return toRound - (toRound%multiple);
}
如果您还想包含负值,则可以对代码进行如下调整(包括测试(:
#include <stdio.h>
int RoundToMultiple(int toRound, int multiple) {
toRound += toRound < 0 ? -multiple / 2 : multiple / 2;
return toRound - (toRound%multiple);
}
int main(int argc, char const *argv[])
{
int tests[] = { 36,99,123,164,-36,-99,-123,-164,0 };
int expectedResults[] = { 0,100,100,200,0,-100,-100,-200,0 };
int i=0;
int test=0, result=0, expectedResult=0;
do {
test = tests[i];
result = RoundToMultiple(test, 100);
expectedResult = expectedResults[i];
printf("test %d: %d==%d ? %sn", test, result, expectedResult, (expectedResult==result ? "OK" : "NOK!"));
i++;
}
while(test != 0);
}
- 查找最接近的大于当前数字的数字的索引
- 必须首先打印向量 v1 中最接近整数 x 的数字<int>
- 查找索引的最接近的真实值
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- C++ lower_bound() 搜索最接近目标值的元素
- C++有效地找到向量中第一个最接近的匹配值?
- 在结构向量中查找最接近的值
- 在排序数组中搜索最接近的 int 值 <= 从右起给定值
- 查找整数数组中最接近的数字
- 我的程序不断四舍五入到最接近的整数
- 将整数舍入到另一个整数的最接近的倍数
- 如果我想将一个无符号整数四舍五入到最接近的更小或等于偶数的整数,我可以除以2然后乘以2吗
- 最接近 C++03 中浮点值的整数
- 取浮点数最接近的整数次幂
- 将整数移动到最接近的可被 4 整除的 C++
- 求最接近整数n的2^i值
- 寻找QT函数将qint64类型的变量(整数)四舍五入到最接近的十
- 如何四舍五入的总成本(双)到最接近的整数
- 整数boost::multiprecision::mpq_rational到最接近的整数
- 如何有效地找到最接近两个整数以100,000为增量的平均值的最大整数