bigint用于精确处理超大整数,解决number在2⁵³−1以上精度丢失问题,适用于金融区块链、密码学、分布式id等场景,但不可与number混用,需注意序列化、运算符及类型转换限制。

BigInt 主要用于需要精确表示和运算超大整数的场景,普通 Number 类型在 253 − 1(即 9007199254740991)以上会丢失精度,而 BigInt 没有这个限制,但也不能直接与 Number 混用。
金融与区块链中的精确整数计算
涉及高精度金额、Token 数量、区块高度或 nonce 等整数值时,一旦超出安全整数范围,Number 就可能产生舍入误差。例如以 wei(以太坊最小单位)表示 1 ETH 是 1018 wei,多个大额转账累加后容易溢出 Number 精度。
- 推荐始终用
10n ** 18n而非Math.pow(10, 18)表示 wei 基准 - 合约交互中接收的链上整数(如通过 ethers.js 的
BigNumber)应显式转为 BigInt:bigNumber.toBigInt() - 避免用
+或==与 Number 比较,改用===和显式转换(如BigInt(num))
密码学与算法实现
某些密码协议(如 RSA 密钥生成、模幂运算、椭圆曲线标量乘)需对数百位甚至上千位整数做算术运算,JavaScript 原生 Number 完全不适用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- BigInt 支持
**(幂)、%(取模)、&(位与)等运算,适合实现基础密码原语 - 注意:除法
/返回 向下取整的 BigInt,不是浮点商;如需小数结果,必须先转 Number(但会丢精度)或使用专用库 - 位运算(
>>>不可用,>>有符号右移仍可用)需确认符号一致性,负 BigInt 的行为与 Number 不同
ID 生成与分布式系统计数器
Snowflake 类 ID(64 位以上)、数据库自增主键(如 MySQL 的 BIGINT UNSIGNED)、日志序列号等,若设计为纯整数且可能超过 Number.MAX_SAFE_INTEGER,就该用 BigInt 存储和比较。
- JSON 不支持 BigInt,序列化前需转字符串:
id.toString();反序列化时手动转回:BigInt(str) - 数据库驱动(如 pg、mysql2)通常不自动转换 BigInt,需在查询层明确处理(例如 pg 的
types.setTypeParser) - 排序和索引操作可正常进行(
Array.sort((a, b) => a - b)不适用,应改用a > b ? 1 : a )
科学计算与数学工具库边界补充
BigInt 不是通用“大数”解决方案——它只支持整数,不支持小数、指数或误差控制。在物理模拟、统计抽样等场景中,仍应优先选用 Decimal.js 或 big.js 等专精库。
- BigInt 无法表示 3.14 或 1.5 × 10100,也不能做开方、对数、三角函数等运算
- 若需混合整数与小数运算(如利率计算),不要强行用 BigInt 拆解,而应统一缩放为整数再运算(例如金额全转为「分」并用 BigInt),最后按需还原
- 性能敏感场景需留意:BigInt 运算比 Number 慢数倍,尤其在循环或递归中频繁创建时
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










