JavaScript % (modulo) 给出负数的负结果
IT技术
javascript
math
modulo
2021-01-14 05:28:18
6个回答
Number.prototype.mod = function (n) {
return ((this % n) + n) % n;
};
摘自这篇文章:JavaScript Modulo Bug
使用Number.prototype
很慢,因为每次使用原型方法时,您的数字都会被包裹在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”函数。
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
其它你可能感兴趣的问题