(自用面试题)为什么0.1 + 0.2 !== 0.3?如何让其相等?

323 阅读1分钟

原因

计算机是通过二进制的方式存储数据的,所以计算机计算0.1+0.2的时候,实际上是计算的这两个数的二进制的和。0.1的二进制是0.000110011001100...(1100循环),0.2的二进制是0.00110011001100...(1100循环),这两个数的二进制都是无限循环的数,对于计算机来说,再大的内存它也存不下这样的数,所以不能存储一个相对于数学来说的值,只能存储一个近似值,这就会使得当计算机存储后再取出时出现精度丢失问题。

明白了这点之后,我们再来看这个问题。

一般我们认为数字包括整数和浮点数,但是在JavaScript中只有Number这一种数字类型,它的实现遵循IEEE 754格式标准,使用64位固定长度来表示,其中小数部分最多只能保留52位,剩余的遵从0舍1入的原则。因此0.1和0.2的二进制数相加,再转化为十进制数就是0.30000000000000004,不为0.3。

解决方法

为浮点数计算设置一个可以接受的误差范围:在ES6中,提供了Number.EPSILON,只要判断0.1+0.2-0.3是否小于Number.EPSILON即可,如果小于,就可以判断为0.1+0.2与0.3相等。