怎么解决0.1+0.2!==0.3

712 阅读1分钟

为什么0.1+0.2不等于0.3

先上图

从图中可以看到,一件违背九年义务教育的事情发生了,最初我是想给我的小学数学老师打个电话的。然而,js就是这么不讲道理,先说下为什么:

计算机无法直接对十进制的数字进行运算, 需要先对照 IEEE 754 规范转换成二进制,然后对阶运算。 0.1转化成二进制的算法:

0.1*2=0.2======取出整数部分0

0.2*2=0.4======取出整数部分0

0.4*2=0.8======取出整数部分0

0.8*2=1.6======取出整数部分1

0.6*2=1.2======取出整数部分1

0.2*2=0.4======取出整数部分0

0.4*2=0.8======取出整数部分0

0.8*2=1.6======取出整数部分1

0.6*2=1.2======取出整数部分1

接下来会无限循环

0.2*2=0.4======取出整数部分0

0.4*2=0.8======取出整数部分0

0.8*2=1.6======取出整数部分1

0.6*2=1.2======取出整数部分1

所以0.1转化成二进制是:0.0 0011 0011 ......

同理可得0.2转化成二进制是 0.0011001100110011...(无限循环)

由于指数位数不相同,运算时需要对阶运算 这部分也可能产生精度损失。 而且二进制最多只有64位。

按照上面两步运算(包括两步的精度损失),最后的结果是

0.1 +0.2 = 0.30000000000000004 **所以0.1+0.2不等于0.3

#解决办法:

出了问题就得解决: 既然这个问题没办法避免,那么我们可不可以找到一个最小数,如果两个数的差小于这个最小数,那么我们就可以认为两个数是相等的。正好,js提供了这么一个最小数,Number.MIN_VALUE

那么我们就可以封装个函数

function equal(a,b) { return a-b < Number.MIN_VALUE; }