JS 中 0.1 + 0.2 不等于 0.3 的原因与解决方案
七崽爱吃小饼干2026/03/01阅读 2
JS 中 0.1 + 0.2 不等于 0.3 的原因与解决方案
一、根本原因:二进制浮点数精度丢失
JavaScript 使用 IEEE 754 双精度浮点数 存储数字,这是所有编程语言通用的标准,但它有天生缺陷:
- 十进制小数无法精确转二进制
- 0.1 和 0.2 转换成二进制时,会变成无限循环小数
- 计算机只能截取有限位数存储,导致精度丢失
- 计算后结果不是精确的 0.3,而是:
js
0.1 + 0.2 // 实际结果:0.30000000000000004 - 所以
0.1 + 0.2 === 0.3结果是 false
二、4 种实用解决方案
方案1:判断误差范围(最通用、推荐)
浮点数计算允许极小误差(Number.EPSILON),只要差值小于这个值,就视为相等。
js
// 封装浮点数相等判断函数
function isFloatEqual(a, b) {
return Math.abs(a - b) < Number.EPSILON;
}
// 测试
console.log(isFloatEqual(0.1 + 0.2, 0.3)); // true
方案2:转为整数计算(金融/金额计算首选)
把小数乘以 10/100/1000 变成整数,计算后再还原,彻底避免精度问题。
js
// 0.1 + 0.2 转为整数:1 + 2 = 3,再除以10
const result = (0.1 * 10 + 0.2 * 10) / 10;
console.log(result === 0.3); // true
方案3:toFixed 保留小数位数(展示用)
适合页面展示,不适合精确计算(会四舍五入):
js
const sum = 0.1 + 0.2;
console.log(sum.toFixed(1) === '0.3'); // true
方案4:使用专业库(大型项目首选)
复杂计算直接用成熟库,避免手写错误:
- decimal.js(最常用)
- big.js
- math.js
js
// 示例:decimal.js
import { Decimal } from 'decimal.js';
const sum = new Decimal(0.1).plus(0.2);
console.log(sum.equals(0.3)); // true
三、总结
- 核心原因:IEEE 754 浮点数二进制存储导致精度丢失
- 最佳实践:
- 简单判断:用
Number.EPSILON误差比较 - 金额/精确计算:转整数计算
- 复杂项目:直接用
decimal.js库
- 简单判断:用
- 永远不要直接用
===比较两个浮点数的计算结果