根据谷歌计算器(-13)% 64 = 51。

根据Javascript(参见这个JSBin),它是-13。

我怎么解决这个问题?


当前回答

使用数字。prototype很慢,因为每次你使用prototype方法时,你的数字都被包裹在一个Object中。而不是这样:

Number.prototype.mod = function(n) {
  return ((this % n) + n) % n;
}

Use:

function mod(n, m) {
  return ((n % m) + m) % m;
}

参见:https://jsperf.app/negative-modulo/2

比使用原型快97%。当然,如果业绩对你来说很重要的话。

其他回答

所以看起来如果你想要mod周围的度(所以如果你有-50度- 200度),你会想要使用这样的东西:

function modrad(m) {
    return ((((180+m) % 360) + 360) % 360)-180;
}

一个“mod”函数,返回一个正的结果。

var mod = function (n, m) {
    var remain = n % m;
    return Math.floor(remain >= 0 ? remain : remain + m);
};
mod(5,22)   // 5
mod(25,22)  // 3
mod(-1,22)  // 21
mod(-2,22)  // 20
mod(0,22)   // 0
mod(-1,22)  // 21
mod(-21,22) // 1

当然

mod(-13,64) // 51

JavaScript中的%操作符是余数操作符,而不是模数操作符(主要区别在于负数的处理方式):

-1 % 8 // -1,不是7

如果x是整数,而n是2的幂,则可以使用x & (n - 1)而不是x % n。

> -13 & (64 - 1)
51 

接受的答案让我有点紧张,因为它重用了%操作符。如果Javascript在未来改变了行为呢?

下面是一个不重用%的解决方案:

function mod(a, n) {
    return a - (n * Math.floor(a/n));
}

mod(1,64); // 1
mod(63,64); // 63
mod(64,64); // 0
mod(65,64); // 1
mod(0,64); // 0
mod(-1,64); // 63
mod(-13,64); // 51
mod(-63,64); // 1
mod(-64,64); // 0
mod(-65,64); // 63