0.1+0.2为什么不等于0.3?如何让其相等

2 阅读1分钟

0.1+0.2为什么不等于0.3?如何让其相等

一、0.1+0.2为什么不等于0.3?

1.底层原理

js的数字统一遵循IEEE 754 双精度浮点数 标准,二进制存储小数

  • 十进制小数0.1/0.2无法用二进制精准表示,会变成无限循环二进制小数
  • 引擎存储时会截断保留有限位数,产生精度丢失

2.实际存储值

0.1 实际存储 ≈ 0.10000000000000001
0.2 实际存储 ≈ 0.20000000000000001

相加:

0.1 + 0.2 = 0.30000000000000004

所以0.1+0.2!==0.3

二、解决方案

1.toFixed保留小数

const res = (0.1 + 0.2).toFixed(1); 
console.log(Number(res) === 0.3); // true

2.放大缩小法(最常用)

function add(a, b) {
    return (a * 10 + b * 10) / 10;
}
console.log(add(0.1, 0.2) === 0.3); // true

3.设置极小误差值(严谨推荐)

浮点数比较不要绝对相等,判断差值小于极小值

const equal = Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON;
console.log(equal); // true

三、极简背诵

  1. 原因:JS 采用 IEEE754 双精度浮点数,0.1、0.2 二进制无法精确存储,存储时精度丢失,相加结果存在微小误差。
  2. 解决:
  • 放大取整运算;
  • 利用 Number.EPSILON 做误差范围比较;
  • toFixed 格式化小数。