余数 (%)
取余 (%) 运算符返回一个操作数除以第二个操作数后的余数。它总是采用被除数的符号。
试一试
console.log(13 % 5);
// Expected output: 3
console.log(-13 % 5);
// Expected output: -3
console.log(4 % 2);
// Expected output: 0
console.log(-4 % 2);
// Expected output: -0
语法
x % y
描述
% 运算符对于两种类型的操作数是重载的:number 和 BigInt。它首先将两个操作数强制转换为数值并测试它们的类型。如果两个操作数都变成 BigInt,它执行 BigInt 取余操作;否则,它执行 number 取余操作。如果一个操作数变成 BigInt 而另一个变成 number,则抛出 TypeError。
对于操作 n % d,n 称为被除数,d 称为除数。如果其中一个操作数是 NaN,n 是 ±Infinity,或者 d 是 ±0,则操作返回 NaN。否则,如果 d 是 ±Infinity 或 n 是 ±0,则返回被除数 n。
当两个操作数都非零且有限时,余数 r 计算为 r := n - d * q,其中 q 是整数,使得 r 与被除数 n 具有相同的符号,同时尽可能接近 0。
请注意,尽管在大多数语言中,“%”是取余运算符,但在某些语言(例如 Python、Perl)中,它是模运算符。模数定义为 k := n - d * q,其中 q 是整数,使得 k 与除数 d 具有相同的符号,同时尽可能接近 0。对于具有相同符号的两个值,两者是等效的,但是当操作数符号不同时,模数结果总是与除数具有相同的符号,而余数与被除数具有相同的符号,这可能导致它们相差一个 d 单位。要在 JavaScript 中获得模数,请使用 ((n % d) + d) % d 来代替 n % d。在 JavaScript 中,模数运算(没有专用运算符)用于规范化位移运算符(<<、>> 等)的第二个操作数,使偏移量始终为正值。
对于 BigInt 除法,如果除数 y 为 0n,则会抛出 RangeError。这是因为数字除以零的余数返回 NaN,但 BigInt 没有 NaN 的概念。
示例
正被除数取余
13 % 5; // 3
1 % -2; // 1
1 % 2; // 1
2 % 3; // 2
5.5 % 2; // 1.5
3n % 2n; // 1n
负被除数取余
-13 % 5; // -3
-1 % 2; // -1
-4 % 2; // -0
-3n % 2n; // -1n
与 NaN 取余
NaN % 2; // NaN
与 Infinity 取余
Infinity % 2; // NaN
Infinity % 0; // NaN
Infinity % Infinity; // NaN
2 % Infinity; // 2
0 % Infinity; // 0
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-multiplicative-operators |
浏览器兼容性
加载中…