干草,我怎样才能将数字四舍五入到最接近的3?
即
25 would return 27
1 would return 3
0 would return 3
6 would return 6
感谢
答案 0 :(得分:64)
if(n > 0)
return Math.ceil(n/3.0) * 3;
else if( n < 0)
return Math.floor(n/3.0) * 3;
else
return 3;
答案 1 :(得分:19)
你在这里!
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
答案 2 :(得分:14)
简单地:
3.0*Math.round(n/3.0)
答案 3 :(得分:11)
正如对已接受答案的评论中所述,您可以使用:
Math.ceil(x/3)*3
(即使x
为0时它没有返回3,因为这可能是OP的错误。)
在此之前发布的九个答案中(尚未删除或没有得到如此低的分数,以至于所有用户都看不到),只有Dean Nicholson的答案(除了丢失的问题)意义)和beauburrier是正确的。接受的答案给出了负数的错误结果,它为0添加了一个例外,以说明OP可能出现的错误。另外两个答案将数字四舍五入到最接近的倍数而不是总是四舍五入,一个给出负数的错误结果,另外三个给出正数的错误结果。
答案 4 :(得分:9)
我在psuedocode中回答这个问题,因为我主要在SystemVerilog和Vera(ASIC HDL)中编程。 %表示模数函数。
round_number_up_to_nearest_divisor = number + ((divisor - (number % divisor)) % divisor)
无论如何都适用。
数字的模数计算余数,从除数中减去得到达到下一个除数倍数所需的数,然后发生“魔术”。你会认为单模数函数足够好,但是在数是除数的精确倍数的情况下,它会计算一个额外的倍数。即,24将返回27.附加模数通过使加法0来防止这种情况。
答案 5 :(得分:6)
此功能将向上舍入到您提供的任何因子的最接近倍数。 它不会向上舍入0或已经是倍数的数字。
round_up = function(x,factor){ return x - (x%factor) + (x%factor>0 && factor);}
round_up(25,3)
27
round up(1,3)
3
round_up(0,3)
0
round_up(6,3)
6
0的行为不是你要求的,但这种方式似乎更加一致和有用。如果你确实想要将0向上舍入,则以下函数会这样做:
round_up = function(x,factor){ return x - (x%factor) + ( (x%factor>0 || x==0) && factor);}
round_up(25,3)
27
round up(1,3)
3
round_up(0,3)
3
round_up(6,3)
6
答案 6 :(得分:2)
(n - n mod 3)+3
答案 7 :(得分:2)
基于@Makram的方法,我发现原始的Math.prototype示例没有准确地舍入负数。这是一个稍微修改过的函数,它处理实例和多个值中的正数和负数:
Number.prototype.mround = function(_mult) {
var base = Math.abs(this);
var mult = Math.abs(_mult);
var mod = (base % mult);
if (mod <= (mult / 2)) {
base -= mod;
} else {
base += (mult - mod);
}
return (this<0)?-base:base ;
}
实施例:
(-2).mround(3)返回-3;
(0).mround(3)返回0;
(2).mround(3)返回3;
(25.4).mround(3)返回24;
答案 8 :(得分:0)
$(document).ready(function() {
var modulus = 3;
for (i=0; i < 21; i++) {
$("#results").append("<li>" + roundUp(i, modulus) + "</li>")
}
});
function roundUp(number, modulus) {
var remainder = number % modulus;
if (remainder == 0) {
return number;
} else {
return number + modulus - remainder;
}
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Round up to nearest multiple of 3:
<ul id="results">
</ul>
&#13;
答案 9 :(得分:0)
一个更通用的答案可能会对某个更通用的问题有所帮助:如果您想将数字四舍五入为分数的倍数,请考虑使用库。这是在GUI中有效的用例,其中将小数输入到输入中,例如,您想将其强制为0.25、0.2、0.5等的倍数。那么幼稚的方法不会让您走得太远:
function roundToStep(value, step) {
return Math.round(value / step) * step;
}
console.log(roundToStep(1.005, 0.01)); // 1, and should be 1.01
在尝试编写自己的函数并查找npm软件包数小时之后,我决定Decimal.js立即完成工作。它甚至有一个toNearest
方法可以做到这一点,您可以选择是向上舍入,向下舍入还是将其舍入为更接近的值(默认)。
const Decimal = require("decimal.js")
function roundToStep (value, step) {
return new Decimal(value).toNearest(step).toNumber();
}
console.log(roundToStep(1.005, 0.01)); // 1.01
答案 10 :(得分:0)
使用余数运算符(模):
map_name = ("./maps/map1_level_{}.tmx.".format(level))
答案 11 :(得分:-1)
if(x%3==0)
return x
else
return ((x/3|0)+1)*3