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

IT技术 javascript integer rounding
2021-03-07 00:11:40

Hay,我如何将一个数字四舍五入到最接近的 3 的倍数?

IE

25 would return 27
1 would return 3
0 would return 3
6 would return 6

谢谢

6个回答
    if(n > 0)
        return Math.ceil(n/3.0) * 3;
    else if( n < 0)
        return Math.floor(n/3.0) * 3;
    else
        return 3;
不要认为这行得通,只会带回相同的数字
2021-04-16 00:11:40
Cambium 是正确的 - 它有效,因为它在再次乘以 3 之前将 n/3 向上舍入到最接近的整数。
2021-04-17 00:11:40
这是为什么?假设我们有 7,我们想要 9,7/3=2.33333,ceil(2.3333)=3,3*3=9。我错过了什么吗?
2021-04-26 00:11:40
看起来需求确实是错误的,但这不一定由开发人员决定。给客户他们想要的东西,然后通过鼻子向他们收取后续更改的费用;)
2021-04-30 00:11:40
@PaulJWilliams:但由于客户的要求与问题陈述不一致,唯一可能的答案是{25:27,1:3,0:3,6:6}[x]即使您忽略了 的情况x=0,如果 -3 明显小于 -1,-1 怎么能四舍五入到 -3?所述问题的正确答案是Math.ceil(x/3)*3
2021-05-13 00:11:40

简单地:

3.0*Math.ceil(n/3.0)

?

这将向上或向下舍入到最接近的倍数而不是总是向上舍入,或者例如3.0*Math.round(25/3.0)返回 24 而不是 27。
2021-04-20 00:11:40
为了遵守疯狂的要求,添加if (n === 0) return 3:P
2021-04-24 00:11:40
除了操作对 n = 0 的要求之外,这应该更高。
2021-05-04 00:11:40
哦,是的,应该是 Math.ceil
2021-05-11 00:11:40
更改ceilfloor为它总是回合下来到最近的倍数。ceilround四舍五入到最接近的倍数。
2021-05-14 00:11:40

这个给你!

Number.prototype.roundTo = function(num) {
    var resto = this%num;
    if (resto <= (num/2)) { 
        return this-resto;
    } else {
        return this+num-resto;
    }
}

例子:

y = 236.32;
x = y.roundTo(10);

// results in x = 240

y = 236.32;
x = y.roundTo(5);

// results in x = 235
else 语句没用
2021-04-15 00:11:40
该问题特别说明(并举例说明)所有数字都应四舍五入。
2021-04-24 00:11:40
@OrangeDog 这太完美了!在您的示例中,1.6 或更多应该导致 3。较小的数字将给出 0。
2021-04-30 00:11:40
Number(1).roundTo(3) 返回 0。
2021-05-01 00:11:40

我用伪代码回答这个问题,因为我主要用 SystemVerilog 和 Vera(ASIC HDL)编程。% 表示模函数。

round_number_up_to_nearest_divisor = number + ((divisor - (number % divisor)) % divisor)

这在任何情况下都有效。

数字的模数计算余数,从除数中减去余数,得到下一个除数倍数所需的数,然后“魔术”发生。您会认为具有单模函数就足够了,但在数字是除数的精确倍数的情况下,它会计算额外的倍数。即,24 将返回 27。附加模数通过使加法为 0 来防止这种情况发生。

这会导致小于 0 但大于 -1 的数字失去意义,因此例如n=-.1;d=3;n+(d-n%d)%d返回8.326672684688674e-17此方法还可用于d通过使d负数将数字向下(而不是向上)四舍五入为 的倍数,但随后会导致大于 0 但小于 1 的数字失去意义,因此d=-3;[-3,-1,-.1,0,.1,3].map(function(x){return x+(d-x%d)%d})返回[-3,-3,-3,0,-8.326672684688674e-17,3].
2021-04-16 00:11:40
function roundUpMultiple(num,div) {return num+((div-(num%div))%div)}
2021-05-14 00:11:40

正如对已接受答案的评论中所述,您可以使用以下命令:

Math.ceil(x/3)*3

(即使它在x0时不返回 3 ,因为这可能是 OP 的错误。)

在此之前发布的九个答案中(没有被删除或没有如此低的分数以致于所有用户都无法看到它们),只有迪恩尼科尔森的那些(除了失去意义的问题)和beauburrier 是正确的。接受的答案给出了错误的负数结果,并为 0 添加了一个例外,以说明 OP 可能出错的原因。另外两个答案将数字四舍五入到最接近的倍数而不是总是四舍五入,另外一个给出负数的错误结果,另外三个甚至给出正数的错误结果。

需要注意的是这个和另一个使用的ceil()是 Javascript 对 ceil 和非常小的十进制值的奇怪之处。请注意这些示例: Math.ceil(216.3/3)*3= 219. Math.ceil(216.00000000000003/3)*3= 219. Math.ceil(216.000000000000003/3)*3= 216. 一个额外的小数位会打破 ceil,因此您尝试获得最接近的 3 倍数。根据您的需要,您可能可以Math.round(n)先。
2021-04-30 00:11:40