【每日笔记 · 4】0.1 + 0.2 === 0.3?

233 阅读1分钟

1.判断两个数字是否相等

0.1 + 0.2 === 0.3 // false

因为计算机不能精确表示0.1, 0.2这样的浮点数,计算时使用的是带有舍入误差的数。

2.数字精度及数值安全范围

Javascript的数字类型是基于IEEE754标准来实现的,该标准通常也被称为“浮点数”。Javascript使用的是“双精度”格式(即64位二进制)。

根据国际标准 IEEE 754,JavaScript 浮点数的64个二进制位,从最左边开始,是这样组成的。

  • 第1位:符号位,0表示正数,1表示负数
  • 第2位到第12位:指数部分
  • 第13位到第64位:小数部分(即有效数字)
IEEE 754 规定,有效数字第一位默认总是1,不保存在64位浮点数之中。也就是说,有效数字总是1.xx...xx的形式,其中xx..xx的部分保存在64位浮点数之中,最长可能为52位。因此,JavaScript 提供的有效数字最长为53个二进制位。

精度最多只能到53个二进制位,这意味着,绝对值小于2的53次方的整数,即-(253-1)到253-1,都可以精确表示。

Number.MIN_VALUE // 最小浮点数 => 5e-324
Number.MAX_VALUE // 最大浮点数 => 1.798e=308

从es6开始,

Number.MAX_SAFE_INTEGER // 最大整数 => 2^53 - 1
Number.MIN_SAFE_INTEGER // 最小整数 

3.机器精度

如何判断0.1 + 0.2 = 0.3

最常见的方法是设置一个误差范围值,通常称为“机器精度”,对Javascript的数字来说,这个值通常是2^-52。

从es6开始,该值定义在Number.EPSILON中。

function numbersEnoughToEqual(n1, n2) {
    return Math.abs(n1 - n2) < Number.EPSILON;
}

const a = 0.1 + 0.2;
const b = 0.3;
numbersEnoughToEqual(a, b); // true