Hay,我如何将一个数字四舍五入到最接近的 3 的倍数?
IE
25 would return 27
1 would return 3
0 would return 3
6 would return 6
谢谢
Hay,我如何将一个数字四舍五入到最接近的 3 的倍数?
IE
25 would return 27
1 would return 3
0 would return 3
6 would return 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;
简单地:
3.0*Math.ceil(n/3.0)
?
这个给你!
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
我用伪代码回答这个问题,因为我主要用 SystemVerilog 和 Vera(ASIC HDL)编程。% 表示模函数。
round_number_up_to_nearest_divisor = number + ((divisor - (number % divisor)) % divisor)
这在任何情况下都有效。
数字的模数计算余数,从除数中减去余数,得到下一个除数倍数所需的数,然后“魔术”发生。您会认为具有单模函数就足够了,但在数字是除数的精确倍数的情况下,它会计算额外的倍数。即,24 将返回 27。附加模数通过使加法为 0 来防止这种情况发生。
正如对已接受答案的评论中所述,您可以使用以下命令:
Math.ceil(x/3)*3
(即使它在x
0时不返回 3 ,因为这可能是 OP 的错误。)
在此之前发布的九个答案中(没有被删除或没有如此低的分数以致于所有用户都无法看到它们),只有迪恩尼科尔森的那些(除了失去意义的问题)和beauburrier 是正确的。接受的答案给出了错误的负数结果,并为 0 添加了一个例外,以说明 OP 可能出错的原因。另外两个答案将数字四舍五入到最接近的倍数而不是总是四舍五入,另外一个给出负数的错误结果,另外三个甚至给出正数的错误结果。