根据谷歌计算器(-13)% 64 = 51。
根据Javascript(参见这个JSBin),它是-13。
我怎么解决这个问题?
根据谷歌计算器(-13)% 64 = 51。
根据Javascript(参见这个JSBin),它是-13。
我怎么解决这个问题?
当前回答
为了好玩,这里有一个“wrap”函数,它的工作方式有点像模数,除了你也可以指定范围的最小值(而不是0):
const wrap = (value = 0, min = 0, max = 10) =>
((((value - min) % (max - min)) + (max - min)) % (max - min)) + min;
基本上就是取真模公式,对其进行偏移,使min值最终为0,然后将min值加回来。
如果有一个值希望保持在两个值之间,则很有用。
其他回答
所以看起来如果你想要mod周围的度(所以如果你有-50度- 200度),你会想要使用这样的东西:
function modrad(m) {
return ((((180+m) % 360) + 360) % 360)-180;
}
为了好玩,这里有一个“wrap”函数,它的工作方式有点像模数,除了你也可以指定范围的最小值(而不是0):
const wrap = (value = 0, min = 0, max = 10) =>
((((value - min) % (max - min)) + (max - min)) % (max - min)) + min;
基本上就是取真模公式,对其进行偏移,使min值最终为0,然后将min值加回来。
如果有一个值希望保持在两个值之间,则很有用。
虽然它没有像你期望的那样运行,但这并不意味着JavaScript没有“运行”。这是JavaScript为模数计算所做的选择。因为根据定义,两个答案都有意义。
请看维基百科。您可以在右边看到不同的语言如何选择结果的符号。
如果x是整数,而n是2的幂,则可以使用x & (n - 1)而不是x % n。
> -13 & (64 - 1)
51
我还要处理négative a和- n
//best perf, hard to read
function modul3(a,n){
r = a/n | 0 ;
if(a < 0){
r += n < 0 ? 1 : -1
}
return a - n * r
}
// shorter code
function modul(a,n){
return a%n + (a < 0 && Math.abs(n));
}
//beetween perf and small code
function modul(a,n){
return a - n * Math[n > 0 ? 'floor' : 'ceil'](a/n);
}