Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.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 根据给定范围向上或向下舍入数字_Javascript_Jquery - Fatal编程技术网

Javascript 根据给定范围向上或向下舍入数字

Javascript 根据给定范围向上或向下舍入数字,javascript,jquery,Javascript,Jquery,我得到了一个要求,即将数字向上或向下舍入到配置的数字范围 例如,范围为0到50。向上舍入将数字舍入为50,向下舍入将数字舍入为0 0-50范围内的测试用例 49060 --> Round up 49060 | Round down 49060 49020 --> Round up 49050 | Round down 49000 49060 --> Round up 49100 | Round down 49050 49050 --> Round up 49100 |

我得到了一个要求,即将数字向上或向下舍入到配置的数字范围

例如,范围为0到50。向上舍入将数字舍入为50,向下舍入将数字舍入为0

0-50范围内的测试用例

49060 --> Round up 49060 | Round down 49060
49020 --> Round up 49050 | Round down 49000
49060 --> Round up 49100 | Round down 49050
49050 --> Round up 49100 | Round down 49050
49049 --> Round up 49049 | Round down 49049
50-100范围内的测试用例

49060 --> Round up 49060 | Round down 49060
49020 --> Round up 49050 | Round down 49000
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;
}
函数舍入(a){
//假设a是一个数字
变量金额=a.toString(),
roundType=‘向上’、//或向下
最小值=0,最大值=50,//这是范围
splitVal=parseInt(amount.substr(-max.toString().length)),
obj={};
//如果splitVal小于最小值或大于最大值,
//然后四舍五入将产生其自身的价值
如果(最大值>分割值| |分割值<最小值){
obj.total=a;
对象舍入=0
}
//如果分割值介于最小值和最大值之间
如果(最大值>分割值>最小值){
obj.total=a+(最大值-拆分值);
obj.舍入=最大值-分割值;
}
返回obj;
}
它适用于范围为0-50的测试用例,但不适用于范围为50-100的测试用例。。特别是如果a为49950,范围为50-100,且其四舍五入


我在这里哪里出错了?

我会使用带100的模运算符(%)。然后,通过提醒,我将确定哪一个范围是在这种情况下,并通过函数中的另一个参数(“up”或“else”),我将计算最终结果

以下是测试函数(仅对两个数字进行测试,它可能会中断,但想法是关键):

函数r(x,类型){
设res=x%100;
让结果;
如果(分辨率<50){
如果(类型=='up'){
结果=x+(50-res);
}
否则{
结果=x-res;
}
}
否则{
如果(类型=='up'){
结果=x+(100-res);
}
否则{
结果=x-res;
}
}
控制台日志(结果);
}

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

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}
}
函数舍入(a、范围a、范围B){
总计=数学绝对值(范围a-范围B)*数学四舍五入(a/数学绝对值(范围a-范围B))
return(rangeA
更短

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};
}
函数舍入(a、rA、rB){

m=Math;b=m.abs;r=b(rA-rB);t=r*m.round(a/r);return(rA首先,您需要找到一个顶部值,以便以后找到剩余值进行检查,如果该值在所需范围内

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

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

函数舍入(值、范围){
var top=Math.pow(10,Math.ceil(Math.log10(Math.max(…range)),
mod=值%top,
基=值-模;
返回mod<范围[0]| | mod>范围[1]
价值
:range.map(r=>base+r);
}
log(圆形(49060[0,50]);/4906049060
log(圆形(49020[0,50]);/4900049050
log(圆形(49060[50100]);/4905049100
log(圆形(49050[50100]);/4905049100
log(圆形(49049[50100]);//49049
log(圆形(49140[0,50]);//49100 49150
log(round(499955[50100]);//499950 500000

.as控制台包装{最大高度:100%!重要;顶部:0;}
给我们举一对数字的例子,例如39.23=>39和51.24=>52和1920.24=>1920和1920.24=>1921这就是你想要实现的吗?给出这个例子
49050-->向上取整49100 |向下取整49050
应该向下取整还是向上取整?同样
49060-->向上取整49060 |向下取整49060
似乎向上取整arest 10,但
49020-->向上取整49050 |向下取整49000
向下取整到最接近的50…?@NedkoDimitrov它将数字的任何部分舍入到最大值(如果向上取整)或最小值(如果向下取整)如果范围在0-49.99之间,任何最后2个值在该范围内的数字,如1230、1242445、14449.98,将向上舍入到49.99或向下舍入到0。@CarstenLøvboAndersen我给出了两个例子,范围是50-100,所以如果我们向上舍入49050,49050的50部分在50-100之间(50>=50>=100),所以我们将其四舍五入到100,这将数字转换为49100。如果我们尝试将其四舍五入,因为50是范围的最小数字,所以没有变化,所以它仍然是49050。res可以是常量,因为它没有重新分配。确定,代码可以进一步优化,这只是一个简单的示例idea@MirzaMašić我喜欢使用模数得到n的想法我们想要检查和取整的数字,但我们如何知道应该将其划分为什么?比如范围是140-249或399-499?@FredA嗯,对于这个特定的请求,范围是0-50和50-100,因此我们使用100。我们可以调整函数并添加第三个参数,即范围,并替换函数wi中100的所有实例新参数为th,新参数为50/2。我喜欢你的实现。但是如果我们取0-50的范围,你的实现对49140或499930这样的数字不起作用。在0-50范围内向上取整的49140将变为49150,向下取整为49100,而在50-100范围内,向上取整的499955将变为50000,向下取整将变为50000me 499950。是否要查看最后两个或三个数字?请将
499930
0-50
499955
50-100
的所需值相加。是的,它将根据范围查找最后的数字量。例如,对于范围0-100,对于40151之类的数字,它可以查找151、51或1 a中的任何一个nd向上取整。在这种情况下,0-100范围内的40151向上取整将变为40200,向下取整将变为40100。对于0-50范围内的数字499930,向上取整将变为499950,向下取整将变为499900。对于5范围内的499955