Javascript 获取数字模范围的正确方法是什么,以使返回值位于最小范围值和最大范围值之间?

Javascript 获取数字模范围的正确方法是什么,以使返回值位于最小范围值和最大范围值之间?,javascript,leaflet,modulo,discrete-mathematics,number-theory,Javascript,Leaflet,Modulo,Discrete Mathematics,Number Theory,我正在查看js代码的传单。有一个wrapNum函数 // @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number // Returns the number `num` modulo `range` in such a way so it lies within // `range[0]` and `range[1]`. The returned value will be always smal

我正在查看js代码的传单。有一个wrapNum函数

// @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number
// Returns the number `num` modulo `range` in such a way so it lies within
// `range[0]` and `range[1]`. The returned value will be always smaller than
// `range[1]` unless `includeMax` is set to `true`.
function wrapNum(x, range, includeMax) {
    var max = range[1],
        min = range[0],
        d = max - min;
    return x === max && includeMax ? x : ((x - min) % d + d) % d + min;
}
所以,他们只是试图找到一个数模范围,使数位于给定的最小-最大范围之间

如果我写
((x-min)%d+d)%d+min
表达式,而不是使用
((x-min)%d)+min
,这会错过原始表达式所涵盖的任何测试用例吗

…这会错过原始表达式中包含的任何测试用例吗

对。对于小于范围最小范围[0]的大多数x值,您将获得不正确的值

这是因为返回的是余数,而不是适当的模,例如

-1 % 12
返回-1,而不是1(请参阅),因此使用卷积:

((x - min) % d + d) % d
得到正确的模值。一些播放代码:

函数包装0(x,范围,includeMax){
var max=范围[1],
最小值=范围[0],
d=最大-最小值;
返回x==max&&includeMax?x:((x-min)%d+d)%d+min;
}
函数包装1(x,范围,includeMax){
var max=范围[1],
最小值=范围[0],
d=最大-最小值;
返回x==max&&includeMax?x:((x-min)%d)+min;
}
函数doCalc(表格){
var num=+form.num.value;
var range=form.range.value.split(',').map(Number);
var includeMax=form.includeMax.checked;
form.result0.value=wrapNum0(num,range,includeMax);
form.result1.value=wrapNum1(num,range,includeMax);
}

范围(最小值、最大值)
包括最大值?
原件(wrapNum0)
已修改(wrapNum1)
计算