Number.prototype.mod = function (n) {
"use strict";
return ((this % n) + n) % n;
};
从这篇文章中获取:JavaScript模数缺陷问题
(-7 + 5) % 5 === -2
,但是((-7 % 5) + 5) % 5 == 3
。请注意,%在这里表示取模运算。 - fadedbee使用 Number.prototype
是慢的,因为每次使用原型方法时都会将您的数字包装在一个 Object
中。不要这样做:
Number.prototype.mod = function(n) {
return ((this % n) + n) % n;
}
使用:
function mod(n, m) {
return ((n % m) + m) % m;
}
查看:https://jsperf.app/negative-modulo/2
比使用prototype快约97%。当然,如果性能对您很重要的话..
n
和 m
的顺序,@StuR。应该是 return ((n % m) + m) % m;
。 - OdinX%
运算符是一个求余运算符,而不是模运算符(主要区别在于如何处理负数):
-1 % 8 // -1, 不是 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
#sec-applying-the-mod-operator
:) 无论如何,感谢您的提醒,我已经从我的答案中去掉了冗余内容,因为它并不重要。 - Shanimal被采纳的答案让我有点紧张,因为它重复使用了 % 运算符。如果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
-
、*
、/
、;
、.
、(
、)
、,
、Math.floor
、function
或 return
的行为发生变化,那么你的代码将会出现严重问题。请注意,不要改变原意。 - xehpukn
是2的幂次方,那么当x
是整数时,可以使用x & (n - 1)
代替x % n
。> -13 & (64 - 1)
51
%
)的问题使用 ES6 箭头函数进行简化,并且不会危险地扩展 Number 原型
const mod = (n, m) => (n % m + m) % m;
console.log(mod(-90, 360)); // 270 (Instead of -90)
这不是一个bug,有三个函数可以计算模数,您可以使用适合自己需求的函数(我建议使用欧几里得函数)
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
%
可能会返回负结果(这就是这些函数的目的,用于修复它)。 - zessxparseInt(-41).mod(-7)
将返回 -6
而不是 1
(这正是我编写整数部分函数的目的)。 - zessx看起来如果你想在度数上进行修改(例如,如果你有-50度至200度),你需要使用类似以下的内容:
function modrad(m) {
return ((((180+m) % 360) + 360) % 360)-180;
}
(-13) % 64
还是-(13 % 64)
?个人而言,我会两种情况都加上括号,以增加清晰度。 - Tyler