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位:小数部分(即有效数字)
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