JavaScript%(模)对负数给出了否定的结果
根据谷歌计算器 (-13) % 64
是51
。
根据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