四舍五入到最接近的数字的倍数

Round to nearest multiple of a number

提问人:Luchian Grigore 提问时间:4/10/2015 更新时间:3/25/2022 访问量:37373

问:

有没有一种惯用的方法可以四舍五入到一个数字的最接近的倍数,而不是向上和向下四舍五入,看看哪一个最接近

假设只有整数:

number   multiple   result
12       5          10
13       5          15
149      10         150
C++ 数学

评论

1赞 VoidStar 4/10/2015
如果可以向下舍入(下限)到最接近的倍数,只需将输入相加,现在您就有了舍入函数。如果您希望它在奇数情况下四舍五入,请改为添加。multiple/2ceil(multiple/2)
0赞 Luchian Grigore 4/10/2015
@VoidStar我不想四舍五入。
1赞 VoidStar 4/10/2015
不过,您必须选择一个决胜局政策。你如何用 6 作为倍数来取 15 分?你要么下去,要么上去。我给了你一个两者兼而有之的方法。在这种情况下,下面的答案仅显示向下舍入,因为它们选择了该选项。尽管有些人甚至更喜欢银行家四舍五入。multiple/2

答:

41赞 Mike Seymour 4/10/2015 #1

将倍数的一半相加,然后向下舍入。

result = ((number + multiple/2) / multiple) * multiple;

result = number + multiple/2;
result -= result % multiple;

如果数字正好在中间,则四舍五入。在这种情况下,如果您想要不同的行为,则可能需要调整计算。此外,如果溢出可能接近类型范围的顶部,则要小心。number

评论

0赞 michalmonday 10/14/2020
嗨,我认为值得注意的是,它可能无法正常工作。我使用了这样的解决方法:我想知道是否有更好的方法可以做到这一点。result = abs(number) + multiple/2; result -= result % multiple; result *= number > 0 ? 1 : -1;
-2赞 Muhamad Iqbal 2/18/2020 #2

我之前在将数字四舍五入到下一个最接近的 5 倍数时回答过这个问题

使用时cmath::abs

int rounded = n + abs((n % denom) - denom);

您可以随心所欲地更改任何面额denom

0赞 siddhartha agarwal 3/25/2022 #3

简单的 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;
    }