余数 (%)

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

取余 (%) 运算符返回一个操作数除以第二个操作数后的余数。它总是采用被除数的符号。

试一试

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

语法

js
x % y

描述

% 运算符对于两种类型的操作数是重载的:number 和 BigInt。它首先将两个操作数强制转换为数值并测试它们的类型。如果两个操作数都变成 BigInt,它执行 BigInt 取余操作;否则,它执行 number 取余操作。如果一个操作数变成 BigInt 而另一个变成 number,则抛出 TypeError

对于操作 n % dn 称为被除数,d 称为除数。如果其中一个操作数是 NaNn 是 ±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 除法,如果除数 y0n,则会抛出 RangeError。这是因为数字除以零的余数返回 NaN,但 BigInt 没有 NaN 的概念。

示例

正被除数取余

js
13 % 5; // 3
1 % -2; // 1
1 % 2; // 1
2 % 3; // 2
5.5 % 2; // 1.5

3n % 2n; // 1n

负被除数取余

js
-13 % 5; // -3
-1 % 2; // -1
-4 % 2; // -0

-3n % 2n; // -1n

与 NaN 取余

js
NaN % 2; // NaN

与 Infinity 取余

js
Infinity % 2; // NaN
Infinity % 0; // NaN
Infinity % Infinity; // NaN
2 % Infinity; // 2
0 % Infinity; // 0

规范

规范
ECMAScript® 2026 语言规范
# sec-multiplicative-operators

浏览器兼容性

另见