余数 (%)

**余数 (%)** 运算符返回一个操作数除以第二个操作数后剩下的余数。它始终采用被除数的符号。

试一试

语法

js
x % y

描述

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

对于运算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 语言规范
# sec-multiplicative-operators

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅