BigInt Math S1
中文标题:BigInt 数学
提案概览
- 阶段: Stage 1
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
提案速览
该提案旨在补充 JavaScript 中仅支持浮点 Number 的 Math 对象,解决整数数学运算缺失的问题,添加 BigInt 数学函数。它提议在 BigInt 命名空间上增加七个静态函数,如 BigInt.abs 和 BigInt.sqrt,这些函数仅接受 BigInt 并返回 BigInt,其中 sqrt 和 cbrt 会进行截断。
Note
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
JavaScript 的 BigInt Math
ECMAScript Stage 1 提案
J. S. Choi,2021–2025
- 规范
- Babel 插件:尚无
描述
(可获取正式草案规范。)
BigInt 对于众多数学、金融、科学和计时应用(例如 Node.js process.hrtime.bigint API)至关重要,因此自 ES 2021 标准化以来,它们一直是 JavaScript 的宝贵补充。
几个内置的 Math 函数对 BigInt 是有意义的,但 JavaScript 目前仍不支持它们。它们仅支持常规的浮点 JavaScript Number。
- 本提案将以下函数添加到作为命名空间的 BigInt 对象中:
BigInt.absBigInt.signBigInt.sqrt*BigInt.cbrt*BigInt.powBigInt.min†BigInt.max†
- 所有这些函数都返回 BigInt。
- 这些函数都不接受除 BigInt 以外的任何参数。
-
sqrt和cbrt将结果朝 0 截断为 BigInt。
- †
min和max至少需要一个参数。
理念
本提案在性能与先例之间取得平衡。
- 单态函数比多态函数更容易让引擎优化。
- BigInt 和 Number 在语义上不可互换。开发人员应意识到何时使用 BigInt 与 Number 以避免错误。
- 从人体工程学角度看,BigInt 数学函数的 API 应尽可能与
Math中现有数字函数保持一致。 - Number 和 BigInt 是原始类型,因此数学函数应采用静态函数形式,如
BigInt.abs(v),而不是原型方法如v.abs()。- 这与
BigInt.asIntN和BigInt.asUintN的先例一致。 - 这与提议的 Decimal128s 不同。Decimal128 将是对象,因此应使用原型方法。
- 这与
愿景
本初步提案仅添加了少数几个 BigInt 方法。愿景是本提案将为新的 BigInt 数学函数提案开辟道路,例如:
BigInt.gcd(v):最大公约数(GCD)BigInt.popCount(v):种群计数BigInt.bitLength(v):位长度,即截断的 log2BigInt.modPow(v, exponent, modulus):模幂运算BigInt.modInverse(v, modulus):模乘法逆元BigInt.fromString(value, radix):基数 n 字符串解析BigInt.toByteArray(v, endian):转换为字节数组BigInt.fromByteArray(bytes, endian):从字节数组转换
其中一些可能也适用于普通整数 Number。
排除的 Math
对 BigInt 没有意义的 Math 函数不包括在本提案中。这些包括: