javascript浮点数处理需分层:展示用tofixed转数值,金额用整数运算,高精度用decimal.js,比较用容差判断。

JavaScript 中浮点数运算结果的标准化输出,核心不是“修好数字”,而是明确场景、分层处理:展示用格式化,计算用整数或高精度对象,比较用容差判断。
展示层面:用 toFixed + 显式转数值
当目标是让用户看到整洁的小数(如价格、百分比、统计值),toFixed() 是最直接的选择,但需注意两点:
- 它返回字符串,必须用 parseFloat() 或 +(一元加号)转回数字,否则后续参与运算会隐式转为 NaN 或字符串拼接
- 仅用于最终输出前,不建议嵌入中间计算链——例如
parseFloat((a + b).toFixed(2))可能因边界值(如 0.095)触发“四舍六入五成双”规则,导致意外舍入 - 示例:
const display = parseFloat((0.1 + 0.2).toFixed(1)); // → 0.3
金额与计数:统一放大为整数再运算
对货币、库存、积分等要求确定性的小数位(通常是 2 位),应全程使用整数运算:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 所有输入先乘以 100(或对应倍数),用 Math.round() 强制取整,避免原始浮点误差被放大
- 加减乘除都在整数域完成,最后再除以 100 并保留两位小数
- 示例:
const sum = (Math.round(a * 100) + Math.round(b * 100)) / 100; - 不推荐只写
(a * 100 + b * 100) / 100—— 因a * 100本身可能已是近似值(如0.29 * 100 ≈ 28.999999999999996),直接相加仍会出错
高精度业务:引入 decimal.js 等专用库
涉及金融结算、科学计算、多步复合运算时,原生 number 类型无法满足要求:
- decimal.js 以十进制方式存储和运算,支持自定义精度、舍入模式,结果可预测
- 它返回的是 Decimal 对象,不能直接用
===比较,需调用.equals()或.toNumber() - 示例:
new Decimal('0.1').add('0.2').equals('0.3') // true(注意传字符串,避免 new Decimal(0.1) 先失真) - 线上可直接引入:
<script src="https://cdn.jsdelivr.net/npm/decimal.js@10.4.3/decimal.min.js"></script>
安全比较:永远不用 === 判断浮点数相等
任何两个浮点运算结果都不该用严格相等判断,哪怕看起来一样:
- 通用做法:用 Math.abs(a - b) 判断是否足够接近
- 对量级差异大的数(如 1e-10 和 1e10),改用相对误差:
Math.abs(a - b) / Math.max(Math.abs(a), Math.abs(b)) - 封装成工具函数更清晰:
function isClose(a, b, eps = 1e-10) { return Math.abs(a - b)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










