舍入数字最接近3的倍数

时间:2010-07-15 09:04:27

标签: javascript integer rounding

干草,我怎样才能将数字四舍五入到最接近的3?

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

感谢

12 个答案:

答案 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)

&#13;
&#13;
$(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;
&#13;
&#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

RunKit example

答案 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