为什么0.1 + 0.2 != 0.3?如何解决这个问题?
原因:
JavaScript采用IEEE 754双精度版本(64位),只要采用这个版本的语言都会有该问题。
0.1在二进制中表示为0.1 = 2^-4 * 1.10011(0011),即0.000110011001100110011......
即0.1在二进制中是无限循环的,很多十进制小数用二进制表示都是无限循环的,但JS采用的浮点数标准会裁剪掉我们的数字。
IEEE 754 双精度版本(64位)将 64 位分为了三段
·第一位用来表示符号
·接下去的 11 位用来表示指数
·其他的位数用来表示有效位,也就是用二进制表示 0.1 中的 10011(0011)
那么这些循环的数字被裁剪了,就会出现精度丢失的问题,也就造成了 0.1 不再是 0.1 了,而是变成了 0.100000000000000002
那么同样的,0.2 在二进制也是无限循环的,被裁剪后也失去了精度变成了 0.200000000000000002
所以这两者相加不等于 0.3 而是 0.300000000000000004
0.1+0.2===0.30000000000000004 // true
既然 0.1 不是 0.1,那为什么 console.log(0.1) 却是正确的呢?
因为在输入内容的时候,二进制被转换为了十进制,十进制又被转换为了字符串(即字符串的隐式转换),在这个转换的过程中发生了取近似值的过程,所以打印出来的其实是一个近似值
console.log(0.100000000000000002) // 0.1
解决方案:
其实解决的办法有很多,这里我们选用原生提供的方式来最简单的解决问题:
parseFloat((0.1 + 0.2).toFixed(10)) === 0.3 // true