Y001-浮点运算
0.1+0.2 === 0.3
// => ???
#答案: false
#解析: 0.1 + 0.2 = 0.30000000000000004
由于以二进制方式对浮点数进行编码,因此向浮点数相加之类的操作会产生舍入误差。
因此0.1 + 0.2 === 0.3 是false
在两数相加时,会先转换成二进制,0.1 和 0.2 转换成二进制的时候尾数会发生无限循环,然后进行对阶运算,JS 引擎对二进制进行截断,所以造成精度丢失。
1.进制转换 0.1和0.2转换成二进制后会无限循环
0.1 -> 0.0001100110011001...(无限循环)
0.2 -> 0.0011001100110011...(无限循环)
所以总结:精度丢失可能出现在进制转换和对阶运算中
这里还有一个小知识点 那为什么 x=0.1 能得到 0.1? 这是因为这个 0.1 并不是真正的0.1。这不是废话吗?别急,听我解释 标准中规定尾数f的固定长度是52位,再加上省略的一位,这53位是JS精度范围。它最大可以表示2^53(9007199254740992), 长度是 16,所以可以使用 toPrecision(16) 来做精度运算,超过的精度会自动做凑整处理 0.10000000000000000555.toPrecision(16) // 返回 0.1000000000000000,去掉末尾的零后正好为 0.1
// 但来一个更高的精度: 0.1.toPrecision(21) = 0.100000000000000005551 复制代码这个就是为什么0.1可以等于0.1的原因