有没有一种惯用的方法可以将数字舍入到最接近的倍数,而不是将其向上和向下四舍五入并查看哪个更接近?
假设只涉及整数:
number multiple result
12 5 10
13 5 15
149 10 150
加上全部的数值的一半,然后向下取整。
result = ((number + multiple/2) / multiple) * multiple;
或者result = number + multiple/2;
result -= result % multiple;
如果数字恰好处于中间,则会将其四舍五入。如果您希望在这种情况下实现不同的行为,则可能需要调整计算。此外,如果number
接近类型范围的顶部,请注意溢出。
result -= result % multiple;
result *= number > 0 ? 1 : -1;
我想知道是否有更好的方法来解决这个问题。 - michalmonday简单的Java解决方案:
public Long roundToNearestLong(Long number, Long multiple) {
if (number == null)
return 0L;
Long smallerMultiple = (number / multiple) * multiple;
Long largerMultiple = smallerMultiple + multiple;
// Return of closest of two
return (number - smallerMultiple >= largerMultiple - number) ? largerMultiple : smallerMultiple;
}
我之前在将数字四舍五入到最接近的5的倍数上已经回答过了。
使用cmath::abs
即可。
int rounded = n + abs((n % denom) - denom);
您可以将 denom
更改为您想要的任何面额
multiple/2
添加到输入中,现在就有了一个四舍五入函数。如果您希望它在奇数情况下向上舍入,请改为添加ceil(multiple/2)
。 - VoidStar