HOWTO · JavaScript
JavaScript 中的模数运算符(%)
本教程讲解如何在 JavaScript 中使用模数运算符(%)。
本页内容
JavaScript 的 % 运算符会返回除法后的余数。对于正数,这个结果通常与人们所说的模运算相同;但被除数为负数时,两者的差异就会显现:JavaScript 的余数符号与被除数相同。本指南将介绍其语法、特殊数值情况和常见用法。
JavaScript 的 % 运算符会返回什么
对于有限数值,a % b 会先将商 a / b 向零截断,再返回余数。在 10 % 3 中,商为 3,余数为 1。结果的符号与被除数(a)相同,因此 -10 % 3 的结果是 -1。正因如此,JavaScript 的 % 是余数运算符,结果并不总是数学模运算所产生的非负值。
语法和基本示例
按以下顺序书写被除数、% 和除数:dividend % divisor。该运算符接受数值操作数,包括小数。在表达式中,左侧的值除以右侧的值,结果是一个数值,可由代码储存、比较,或传入其他计算。示例将每个结果赋给一个命名常量,并把两个值输出到控制台:
const wholeRemainder = 10 % 3;
const fractionalRemainder = 5.5 % 2;
console.log(wholeRemainder);
console.log(fractionalRemainder);
第一个结果是 1;第二个结果是 1.5,因为 2 在 5.5 中可以整除两次,剩下 1.5。数据包所提供的运行记录确认了这两个输出:1 和 1.5。
负数和边界情况
余数的符号与被除数相同:10 % 3 的结果是 1,-10 % 3 的结果是 -1,而 10 % -3 的结果是 1。负数的整倍数可能产生负零,例如 -4 % 2;如果零的符号很重要,可以用 Object.is(-4 % 2, -0) 检查。
如果任一操作数是 NaN、被除数是无穷大,或除数是 0 或 -0,JavaScript 都会返回 NaN。如果被除数是有限值而除数是无穷大,结果会原样返回被除数,因此 5 % Infinity 的结果是 5。这些结果符合 JavaScript 的数值余数运算规则;数据包没有提供这些情况的运行结果。
% 运算符的常见用途
对于整数输入,可以用 n % 2 === 0 检查偶数,用 n % 2 !== 0 检查奇数。负整数也适用,因为它们的余数为 0 或 -1。如果输入可能是小数或数字字符串,请先验证或规范化,再进行整数奇偶判断。
对于有限数值,value % 1 会得到带符号的小数余数;例如,5.5 % 1 的结果是 0.5,而 -5.5 % 1 的结果是 -0.5。若要取得负数的正小数部分,应明确选择一种规范化规则,不要假设 % 1 一定会得到非负值。
对于非负的整数分钟数,可以用 hours = Math.floor(minutes / 60) 和 remainingMinutes = minutes % 60 将其拆分为小时和分钟。例如,135 分钟可拆分为 2 小时和 15 分钟。
若要让循环中的操作每三轮执行一次,可以检查 i % 3 === 0。若要在数组的两个条目之间轮换,并且 round 从 1 开始,可以使用 (round - 1) % players.length;减去一可让第一轮使用索引 0。这两种模式分别要求间隔为正数、数组非空。
余数与数学模运算
数学模运算通常会返回一个从 0(含)到正模数(不含)之间的值。JavaScript 的 % 则保留被除数的符号,因此 -10 % 3 的结果是 -1。对于有限的 a 和有限正模数 n,表达式 ((a % n) + n) % n 可将结果规范化为非负的模运算形式。例如,模数为 3 时,它会将 -10 映射为 2。请明确说明模数为正这一前提;此模式不能普遍替代任意除数下的 %。