Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将数字四舍五入至3的最接近倍数_Javascript_Integer_Rounding - Fatal编程技术网

Javascript 将数字四舍五入至3的最接近倍数

Javascript 将数字四舍五入至3的最接近倍数,javascript,integer,rounding,Javascript,Integer,Rounding,嘿,我该怎么把一个数字四舍五入到最接近的3的倍数呢 即 如果(n>0),谢谢 return Math.ceil(n/3.0)*3; else if(n

嘿,我该怎么把一个数字四舍五入到最接近的3的倍数呢

如果(n>0),谢谢 return Math.ceil(n/3.0)*3; else if(n<0) 返回数学楼层(n/3.0)*3; 其他的 返回3; (n-n模块3)+3

给你

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

此函数将四舍五入到您提供的任何因子的最近倍数。 它不会对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

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

round_number_up_to_nearest_divisor = number + ((divisor - (number % divisor)) % divisor)
这在任何情况下都有效

数字的模数计算余数,从除数中减去余数,得到下一个除数倍数所需的数字,然后“神奇”出现。你可能会认为使用单模函数就足够了,但是如果这个数是除数的精确倍数,它会计算出一个额外的倍数。也就是说,24会返回27。附加模量通过使加法为0来防止这种情况。

简单地说:

3.0*Math.ceil(n/3.0)

$(文档).ready(函数(){
var模数=3;
对于(i=0;i<21;i++){
$(“#结果”)。追加(“
  • ”+汇总(i,模数)+“
  • ”) } }); 函数汇总(数字、模数){ var余数=数%模数; 如果(余数==0){ 返回号码; }否则{ 返回数+模-余数; } }
    
    四舍五入至3的最接近倍数:
    
    如对已接受答案的评论中所述,您可以使用以下内容:

    数学单元(x/3)*3 (即使当
    x
    为0时它不会返回3,因为这可能是OP的错误。)


    在此之前发布的九个答案中(未被删除或分数不太低,所有用户都看不到),只有迪安·尼科尔森(失去重要性的问题除外)和博布里耶的答案是正确的。被接受的答案给出了负数的错误结果,它为0添加了一个例外,以解释OP可能犯的错误。另外两个答案将数字四舍五入到最近的倍数,而不是总是四舍五入,另一个答案给出了负数的错误结果,还有三个甚至给出了错误的正数结果。

    在@Makram方法的基础上,结合@Adam随后的评论,我修改了原始Math.prototype示例,以便在以零为中心和无偏系统中准确地舍入负数:

    Number.prototype.mround = function(_mult, _zero) {
    
      var bias = _zero || false;
      var base = Math.abs(this);
      var mult = Math.abs(_mult);
    
      if (bias == true) {
        base = Math.round(base / mult) * _mult;
        base = (this<0)?-base:base ;
      } else { 
        base = Math.round(this / _mult) * _mult;
      }
    
      return parseFloat(base.toFixed(_mult.precision()));
    
    }
    
    Number.prototype.precision = function() {
      if (!isFinite(this)) return 0;
      var a = this, e = 1, p = 0;
      while (Math.round(a * e) / e !== a) { a *= 10; p++; }
      return p;
    }
    
    Number.prototype.mround=函数(\u mult,\u zero){
    var偏差=_零| |假;
    var base=Math.abs(本);
    var mult=数学abs(_mult);
    如果(偏差==真){
    基数=数学圆(基数/倍数)*\u倍数;
    
    基数=这是一个更一般的答案,它可能会帮助一个更一般的问题:如果你想把一个小数乘以一个数,考虑使用一个库。这是一个在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包之后,我决定立即完成这项工作。它甚至有一个
    toNearest
    方法来完成这项工作,您可以选择是向上取整、向下取整还是更接近值(默认值)

    使用余数运算符(模数):


    如果我们有7个,我们想要9,7/3=2.33333,ceil(2.3333)=3,3*3=9.我是否遗漏了什么?Cambium是对的-它是有效的,因为它将n/3四舍五入到最接近的整数,然后再乘以3。看起来要求是错误的,但这不一定由开发人员来决定。给客户他们想要的,然后就后续的更改向他们收取费用;)@PaulJWilliams:但是由于客户的要求与问题陈述不一致,唯一可能的答案是
    {25:27,1:3,0:3,6:6}[x]
    。即使您忽略
    x=0
    的情况,如果-3明显小于-1,-1如何舍入到-3?对所述问题的正确答案是
    Math.ceil(x/3)*3
    .0将返回3???为什么?javascript的mod运算符的可能重复为%,此外,它将(错误地)对已经是3的倍数的偶数进行取整。。不满足(mad)当n==0时的要求。这实际上是对这个问题的唯一正确答案。什么?
    x/3 | 0
    Math.floor(x/3)
    相同,只是根据计算速度慢了27%。此外,如果
    x=-4
    ,那么它输出0,这显然是不正确的,无论你如何定义舍入。
    Number(1)。roundTo(3)
    返回0。@OrangeDog这太完美了!在您的示例中,1.6或更大的值应得到3。较小的数字将得到0。问题明确指出(并给出了示例)所有数字都应向上舍入。else语句是无用的
    函数roundUpMultiple(num,div){return num+((div-(num%div))%div)}
    这会导致小于0但大于-1的数字失去显著性,因此,例如
    n=-.1;d=3;n+(d-n%d)%d
    返回
    8.32667268688674e-17
    。此方法也可用于向下舍入(而不是向上舍入)通过使
    d
    为负值,使
    d
    的倍数,但随后它会导致大于0但小于1的数字失去意义,因此
    d=-3;[-3,-1,-.1,0,1,3].map(函数(x){return x+(d-x%d)%d}
    返回
    [-3,-3,0,-8.326674688674e-17,3]
    round_number_up_to_nearest_divisor = number + ((divisor - (number % divisor)) % divisor)
    
    3.0*Math.ceil(n/3.0)
    
    Number.prototype.mround = function(_mult, _zero) {
    
      var bias = _zero || false;
      var base = Math.abs(this);
      var mult = Math.abs(_mult);
    
      if (bias == true) {
        base = Math.round(base / mult) * _mult;
        base = (this<0)?-base:base ;
      } else { 
        base = Math.round(this / _mult) * _mult;
      }
    
      return parseFloat(base.toFixed(_mult.precision()));
    
    }
    
    Number.prototype.precision = function() {
      if (!isFinite(this)) return 0;
      var a = this, e = 1, p = 0;
      while (Math.round(a * e) / e !== a) { a *= 10; p++; }
      return p;
    }
    
    function roundToStep(value, step) {
      return Math.round(value / step) * step;
    }
    
    console.log(roundToStep(1.005, 0.01)); // 1, and should be 1.01
    
    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
    
    (n - 1 - (n - 1) % 3) + 3