给了我一个要求,它是将数字向上或向下舍入到配置的数字范围。
例如,范围为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,并且将其四舍五入。
我在哪里犯错了?
答案 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};
}
修改:修改代码