<p>JavaScript浮点数精度丢失源于IEEE 754双精度表示限制;应避免直接用===比较、减少小数连续运算,优先转整数运算(如元→分),并用误差容忍法比较(Math.abs(a - b) < epsilon)。</p>

JavaScript 中浮点数精度丢失是由于 IEEE 754 双精度浮点数表示法的固有限制,不是运算符本身的问题,但合理使用运算符和策略能有效规避常见误差场景。关键在于:不直接用 === 比较浮点结果、避免连续小数运算累积误差、把小数转整数再算。
用整数运算代替小数运算
价格计算、百分比、尺寸换算等场景,优先将单位放大(如元→分、米→毫米),全程用整数加减乘除,最后再还原。
- 错误写法:
0.1 + 0.2 === 0.3 // false - 推荐写法:
(10 + 20) / 100 === 0.3 // true(先算分,再除100得元) - 通用函数示例:
function add(a, b, scale = 100) { return Math.round((a * scale + b * scale) / scale); }add(0.1, 0.2); // 0.3
比较浮点数用「误差容忍」而非严格相等
不用 === 或 == 判断两个浮点结果是否“相等”,改用差值小于一个极小量(epsilon)来判断。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 简单判断:
Math.abs(a - b) (适用于大多数情况) - 更稳妥的自定义 epsilon:
Math.abs(a - b) - 注意:
Number.EPSILON约为2.22e-16,适合比较接近 0 的数;数值越大,所需 epsilon 也应适当放大
用 toFixed 配合 parseFloat 控制显示与舍入
toFixed() 返回字符串,用于格式化输出;若需继续计算,必须用 parseFloat() 转回数字——但要注意它仍可能带精度问题,所以只建议在「最终展示」或「转整数后参与下一轮计算」时使用。
立即学习“Java免费学习笔记(深入)”;
- 显示用:
(0.1 + 0.2).toFixed(1) // "0.3" - 慎用于计算:
parseFloat((0.1 + 0.2).toFixed(1)) // 0.3(看似安全,但本质是取巧) - 更可靠做法:先整数化 → 运算 →
toFixed→ 再 parseFloat(仅当必须转数字时)
复杂计算用专用库或 BigInt(高精度需求)
金融、科学计算等不容出错的场景,别硬扛原生浮点限制。
- 推荐库:
decimal.js(功能全、API 友好)、big.js(轻量、专注基本运算)、mathjs(支持表达式解析) - 简单示例(decimal.js):
new Decimal(0.1).plus(0.2).equals(0.3) // true - 整数超大时可用
BigInt,但注意它不支持小数,需自行管理小数位(如统一放大 10ⁿ 倍)

















