根据给定范围向上或向下取整

时间:2019-01-22 15:19:15

标签: javascript jquery

给了我一个要求,它是将数字向上或向下舍入到配置的数字范围。

例如,范围为0到50。四舍五入会将数字四舍五入为50,四舍五入会将数字四舍五入为

测试用例范围为0-50

49060 --> Round up 49060 | Round down 49060
49020 --> Round up 49050 | Round down 49000

测试用例范围为50-100

49060 --> Round up 49100 | Round down 49050
49050 --> Round up 49100 | Round down 49050
49049 --> Round up 49049 | Round down 49049

所以我开发了以下代码

function rounding( a ){

    // Assume that a is a number
    var amount = a.toString(),
        roundType = 'up', // or down
        min = 0, max = 50, // This is the range
        splitVal = parseInt( amount.substr( -max.toString().length ) ),
        obj = {};

    // If splitVal is smaller than min or bigger than max,
    // then rounded up will yied its own value
    if (max > splitVal || splitVal < min){
        obj.total = a;
        obj.rounding = 0
    }

    // If split value is between min and max
    if (max > splitVal > min){
        obj.total = a + ( max - splitVal );
        obj.rounding = max - splitVal;
    }

    return obj;
}

它适用于范围为0-50的测试用例,但不适用于范围为50-100的测试用例。特别是如果a为49950,范围为50-100,并且将其四舍五入。

我在哪里犯错了?

3 个答案:

答案 0 :(得分:2)

首先,您需要找到一个最大值,以便稍后找到余数以进行检查(如果它在所需范围内)。

如果不返回原始值(在此代码中,仅返回一个值,而不是向下和向上舍入的值两个值)。

如果在所需范围内,则返回一个基值加下限范围,并返回基值加上限范围。

function round(value, range) {
    var top = Math.pow(10, Math.ceil(Math.log10(Math.max(...range)))),
        mod = value % top,
        base = value - mod;

    return mod < range[0] || mod > range[1]
        ? value
        : range.map(r => base + r);
}

console.log(round(49060, [0, 50]));    //  49060   49060
console.log(round(49020, [0, 50]));    //  49000   49050
console.log(round(49060, [50, 100]));  //  49050   49100
console.log(round(49050, [50, 100]));  //  49050   49100
console.log(round(49049, [50, 100]));  //  49049   49049
console.log(round(49140, [0, 50]));    //  49100   49150
console.log(round(499955, [50, 100])); // 499950  500000
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

为此,我将使用100的模数运算符(%)。然后,通过提醒,我确定了哪种情况是正确的,并使用函数中的另一个参数(“ up”或其他参数)来计算最终结果。

这里是测试函数(仅对偶数进行测试,可能会破译,但思想是关键):

 函数r(x,type){
  令res = x%100;
  让结果

  if(res <50){
    if(type ==='up'){
        结果= x +(50-res);
    }
    其他{
        结果= x-res;
    }
  }
  其他{
    if(type ==='up'){
        结果= x +(100-res);
    }
    其他{
        结果= x-res;
    }
  }

  console.log(result);
}
 

答案 2 :(得分:0)

这是较少的代码,易于理解

function rounding(a,rangeA,rangeB){
    total = Math.abs(rangeA - rangeB) * Math.round(a / Math.abs(rangeA - rangeB))
    return (rangeA < a || a < rangeB)?{total: total, rounding: Math.abs(a - total)}:{total: a, rounding: 0}
}

更短

function rounding(a,rA,rB){
    m=Math;b=m.abs;r=b(rA-rB);t=r*m.round(a/r);return(rA<a||a<rB)?{total:t,rounding:b(a-t)}:{total:a,rounding:0};
}

修改:修改代码