JavaScript处理大数字需分场景:整数超安全范围(9007199254740991)用BigInt;小数精度敏感场景(如金额)用decimal.js或bignumber.js;JSON传大整数须转字符串防丢失;中间计算可接受可控误差。

JavaScript 处理大数字不能靠“统一方案”,得按数据类型和业务目标分开应对:整数超限用 BigInt,小数精度敏感(如金额)用 decimal.js 或 bignumber.js,JSON 传大整数必须防解析丢失,中间计算可接受可控误差。
整数超安全范围:用 BigInt,但别混 Number
Number.MAX_SAFE_INTEGER 是 9007199254740991,超过就不可信。比如 ID、哈希值、计数器超出此值,必须用 BigInt:
- 创建方式:直接写
12345678901234567890123n,或调用BigInt("123...") - 运算严格隔离:不能
10n + 5,要写成10n + BigInt(5)或10n + 5n - 支持 + − * ** % > & | ^,但除法
/会自动向下取整(无小数) - JSON 不支持 BigInt,序列化前需转字符串:
id.toString();反序列化后手动恢复
小数精度关键场景:别用 Number,用 decimal.js 或 bignumber.js
0.1 + 0.2 !== 0.3 是浮点固有缺陷,金融、科学计算等不能妥协:
- 统一用字符串初始化:
new Decimal("0.1").plus("0.2"),传0.1仍带原始误差 - decimal.js 功能最全(支持 sin/log/pow/rounding mode),适合银行复利、物理模拟
- bignumber.js 更轻量、兼容老环境,API 简洁,适合前端嵌入和长期维护项目
- 避免已停更的
big.js(注意拼写),也别用parseFloat((x).toFixed(n))这类伪精度封装
后端传大数时:JSON 解析是第一道失守点
标准 JSON.parse 会把超长数字(如 ID、时间戳)直接转成不精确的 Number:
立即学习“Java免费学习笔记(深入)”;
- 最优解:后端把大整数字段序列化为字符串,如
{"id": "90071992547409912345"} - 次优解:前端用
json-bigint替代原生 JSON:JSONbig.parse(jsonStr),支持useNativeBigInt选项 - 校验前置:输入或响应后立刻用
Number.isSafeInteger()检查,不安全就拒收或转 BigInt
性能敏感环节:允许局部降级,守住关键节点
不是所有计算都要 100% 精确,动画、日志聚合、中间态可以权衡速度:
- 展示用
.toFixed(2)可以,但注意它返回字符串,且1.005.toFixed(2) === "1.00"(非四舍五入) - 快速保留两位小数:用
Math.round(x * 100) / 100,比调库快一个数量级 - 大数组求和/均值:用
for循环代替reduce,避免闭包开销 - 只对用户可见、影响决策的值(付款金额、库存余量)做严格精度保障
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/126967.html