eg:0.5 - 0.4 === 0.1 主观认为是对的,没毛病吧?但是计算机不这么认为
这里涉及到计算机里面对小数的存储精度问题。
计算机里面只能存储二进制。整数部分就不讨论了
看小数部分:10进制转2进制规则:乘2取整,顺序排列
eg:10进制的0.125转为2进制
0.125 * 2 = 0.5 取0
0.5 * 2 = 1.0 取1
0.0
所以最终变为2进制就是 0 1
eg:10进制的0.2
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
.。。。。。。
最终变为2进制就是 0011的循环
看出:0.2不是一个循环的小数,但是转换为2进制就是一个循环的二进制小数,这就是计算机里面对小数运算不精确的一个根源所在。存得都不精确,参与运算也就肯定不精确。
console.log(0.5-0.4==0.1); //false
console.log(0.5-0.4===0.1); //false
console.log(0.5-0.4); //0.09999999999999998
总结:JS语言不适合科研计算,像需要很精确得计算,会出现误差