余数 (%)
**余数 (%
)** 运算符返回一个操作数除以第二个操作数后剩下的余数。它始终采用被除数的符号。
试一试
语法
js
x % y
描述
%
运算符对两种类型的操作数进行了重载:数字和BigInt。它首先将两个操作数强制转换为数值并测试它们的类型。如果两个操作数都成为BigInt,则执行BigInt余数;否则,执行数字余数。TypeError
如果一个操作数变成BigInt而另一个操作数变成数字,则会抛出。
对于运算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
的概念。
示例
正被除数的余数
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 表格仅在浏览器中加载