JavaScript%(模)对负数给出了否定的结果

根据谷歌计算器 (-13) % 6451

根据Javascript(见这JSBin )它是-13

我该如何解决?

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

采取从这篇文章: JavaScript模块错误

使用Number.prototype是SLOW,因为每次使用原型方法时,您的数字都被封装在一个Object中。 而不是这个:

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

使用:

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

http://jsperf.com/negative-modulo/2

比使用原型快97%。 如果性能对你来说当然是重要的..

JavaScript中的%运算符是余数运算符,而不是模运算符(主要区别在于如何处理负数):

-1 % 8 // -1, not 7

无论如何, 这里是一个 “MOD”function的教程 ,返回一个积极的结果。

 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改变未来的行为呢?

这是一个解决方法,不重复使用%:

 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 

尽pipe它没有像你期望的那样行事,但这并不意味着JavaScript不“performance”。 这是一个selectJavaScript的模数计算。 因为根据定义,答案是有道理的。

从维基百科看这个 。 你可以在右边看到不同的语言select了结果的标志。

如果x是整数且n是2的幂,则可以使用x & (n - 1)来代替x % n

 > -13 & (64 - 1) 51 

所以看起来,如果你正在尝试调整度数(所以如果你有-50度-200度),你会想要使用类似于:

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

这不是一个错误,有3个函数来计算模数,你可以使用一个适合你的需求(我会build议使用欧几里德函数)

截断小数部分函数

 console.log( 41 % 7 ); // 6 console.log( -41 % 7 ); // -6 console.log( -41 % -7 ); // -6 console.log( 41 % -7 ); // 6 

整数部分函数

 Number.prototype.mod = function(n) { return ((this%n)+n)%n; }; console.log( parseInt( 41).mod( 7) ); // 6 console.log( parseInt(-41).mod( 7) ); // 1 console.log( parseInt(-41).mod(-7) ); // -6 console.log( parseInt( 41).mod(-7) ); // -1 

欧几里德函数

 Number.prototype.mod = function(n) { var m = ((this%n)+n)%n; return m < 0 ? m + Math.abs(n) : m; }; console.log( parseInt( 41).mod( 7) ); // 6 console.log( parseInt(-41).mod( 7) ); // 1 console.log( parseInt(-41).mod(-7) ); // 1 console.log( parseInt( 41).mod(-7) ); // 6 

我也处理非负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); } 

有一个NPM包,将为你做的工作。 您可以使用以下命令安装它。

npm install just-modulo --save

自述文件中复制的用法

 import modulo from 'just-modulo'; modulo(7, 5); // 2 modulo(17, 23); // 17 modulo(16.2, 3.8); // 17 modulo(5.8, 3.4); //2.4 modulo(4, 0); // 4 modulo(-7, 5); // 3 modulo(-2, 15); // 13 modulo(-5.8, 3.4); // 1 modulo(12, -1); // NaN modulo(-3, -8); // NaN modulo(12, 'apple'); // NaN modulo('bee', 9); // NaN modulo(null, undefined); // NaN 

GitHub存储库可以通过以下链接find:

https://github.com/angus-c/just/tree/master/packages/number-modulo