为什么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; }