创见博客
JS 中 0.1 + 0.2 不等于 0.3 的原因与解决方案
七崽爱吃小饼干2026/03/01阅读 2

JS 中 0.1 + 0.2 不等于 0.3 的原因与解决方案

一、根本原因:二进制浮点数精度丢失

JavaScript 使用 IEEE 754 双精度浮点数 存储数字,这是所有编程语言通用的标准,但它有天生缺陷:

  1. 十进制小数无法精确转二进制
    • 0.1 和 0.2 转换成二进制时,会变成无限循环小数
    • 计算机只能截取有限位数存储,导致精度丢失
  2. 计算后结果不是精确的 0.3,而是:
    js
    0.1 + 0.2 
    // 实际结果:0.30000000000000004
    
  3. 所以 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

三、总结

  1. 核心原因:IEEE 754 浮点数二进制存储导致精度丢失
  2. 最佳实践:
    • 简单判断:用 Number.EPSILON 误差比较
    • 金额/精确计算:转整数计算
    • 复杂项目:直接用 decimal.js 库
  3. 永远不要直接用 === 比较两个浮点数的计算结果
评论
0/100