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

21

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

假设只涉及整数:

number   multiple   result
12       5          10
13       5          15
149      10         150

1
如果您可以向下取整到最近的倍数,只需将multiple/2添加到输入中,现在就有了一个四舍五入函数。如果您希望它在奇数情况下向上舍入,请改为添加ceil(multiple/2) - VoidStar
@VoidStar 我不想四舍五入。 - Luchian Grigore
1
你必须选择一个决胜策略。如果以6为倍数,如何将15四舍五入?你可以向下或向上取整。我给了你两种方法。以下答案仅显示向下取整,因为它们选择了“multiple/2”选项。尽管有些人更喜欢银行家舍入。 - VoidStar
3个回答

41

加上全部的数值的一半,然后向下取整。

result = ((number + multiple/2) / multiple) * multiple;
或者
result = number + multiple/2;
result -= result % multiple;

如果数字恰好处于中间,则会将其四舍五入。如果您希望在这种情况下实现不同的行为,则可能需要调整计算。此外,如果number接近类型范围的顶部,请注意溢出。


嗨,我认为值得注意的是它可能无法正确处理负数。我使用了这样的解决方法:result -= result % multiple; result *= number > 0 ? 1 : -1;我想知道是否有更好的方法来解决这个问题。 - michalmonday

0

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

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接