JavaScript浮点数精度问题是IEEE 754标准固有特性,修复需按场景选数据抽象:整数运算(如金额用“分”)、toFixed+parseFloat校准显示、decimal.js处理高精度需求、误差容忍比较替代===。

JavaScript 浮点数运算精度问题不是“bug”,而是 IEEE 754 双精度浮点标准的固有特性——像 0.1、0.2 这类十进制小数在二进制中是无限循环小数,存储时必然截断,导致计算结果偏差(如 0.1 + 0.2 === 0.30000000000000004)。修复的关键不在于“修正 JS”,而在于按场景选对数据抽象方式。
用整数代替小数做运算(适合金额、计数等固定位数)
把小数放大成整数计算,全程避开浮点参与,最稳妥、零依赖。
- 例如金额统一用“分”:
(10 + 20) / 100得到0.3,而非0.1 + 0.2 - 封装函数时注意小数位数一致性:取两个数中小数位数最大值作为缩放因子,避免手动写死
100 - 慎用于超大数:
123456789.123 * 1000可能超出Number.MAX_SAFE_INTEGER,引发整数精度丢失
显示层用 toFixed + parseFloat 校准(仅限最终输出)
它不改变计算逻辑,只修正展示效果,适合 UI 渲染、日志打印等场景。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 写法:
parseFloat((0.1 + 0.2).toFixed(10))→0.3 -
toFixed(n)返回字符串,必须转回数值才能参与后续计算 - 别在中间步骤反复使用:多次
toFixed会叠加舍入误差,比如累加循环中每步都四舍五入,结果会偏移
高精度计算必须用 decimal.js 等库(金融/科学计算必备)
当业务要求全程无舍入误差(如支付结算、利率复利、单位换算),原生 number 类型无法满足。
立即学习“Java免费学习笔记(深入)”;
-
decimal.js按十进制建模,支持自定义精度、舍入模式和指数范围 - 示例:
new Decimal('0.1').add('0.2').equals('0.3')→true(注意传字符串,避免构造时就失真) - 返回的是对象,不能直接
===比较或传给Math.max,要用.toNumber()或对应方法
比较浮点数改用误差容忍(通用防御习惯)
永远不要用 === 判断两个浮点运算结果是否“相等”,这是高频出错点。
- 基础写法:
Math.abs(a - b) - 更健壮用相对误差:
Math.abs(a - b) - 建议封装为工具函数:
isClose(a, b, tolerance = 1e-10),提升可读性和复用性

















