JavaScript中Number精度丢失无法彻底消除,但可按场景精准控制:金额类用整数放大法(如乘100再除),金融计算引入decimal.js或bignumber.js,展示用toFixed+parseFloat,超大整数ID改用字符串或BigInt。

JavaScript 中 Number 的精度丢失无法彻底消除,但能按场景精准控制。核心思路是:避开 IEEE 754 浮点运算的固有缺陷,改用整数、字符串或专用高精度类型处理关键数值。
金额类固定小数位运算:用整数放大法
适用于价格、余额、税费等小数位明确(如两位)的业务场景。把小数转成整数全程计算,最后还原,不碰浮点运算。
- 先统计参与数中最大小数位数,例如 0.123 和 4.5 最多 3 位,放大倍数为 1000
- 用 Math.round() 放大,避免 0.29 * 100 得到 28.999999999999996 这类新误差
- 注意安全边界:放大后结果不能超过 Number.MAX_SAFE_INTEGER(约 9e15),否则整数本身也会失真
金融或科学计算:引入 decimal.js 或 bignumber.js
当精度要求严苛、涉及幂运算、开方、多步链式计算时,必须用专业库。它们用字符串+算法模拟十进制运算,不依赖原生 Number。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- decimal.js 更轻量,API 直观,支持自定义舍入模式(如四舍五入、向上取整),适合大多数前端金融逻辑
- bignumber.js 兼容性更好,对超大数、链式调用更稳健,适合复杂财务引擎或区块链相关计算
- 两者都能让
new Decimal('0.1').plus('0.2').toString()稳定返回'0.3',也支持.toFixed(2)正确处理 1.335 → '1.34'
展示与简单比较:用 toFixed + parseFloat 组合
仅用于界面显示或做简单相等判断时可用,但不是计算工具。
立即学习“Java免费学习笔记(深入)”;
-
(0.1 + 0.2).toFixed(10)得到'0.3000000000',再parseFloat()可得干净的 0.3 - 不要在中间计算步骤反复使用
toFixed,它会截断而非四舍五入(1.335.toFixed(2) 返回 '1.33' 是已知缺陷) - 更适合配合 Number.EPSILON 做近似相等判断:
Math.abs(a - b) < Number.EPSILON
超大整数 ID 或计数器:优先用字符串或 BigInt
后端传来的 long 型 ID、时间戳、区块链地址等,一旦超过 253 − 1,Number 就无法精确表示。
- 后端应将这类字段序列化为字符串(JSON 中
"id": "9223372036854775807"),前端直接当字符串处理 - 若需运算,用 BigInt(注意末尾加
n,如123n),但需确保所有参与值都是 BigInt,且不能和普通数字混用

















