浮点数精度问题,为什么0.1===0.1 5+0.1 = 5.1?

在js中,会经常的遇到浮点数精度问题(0.1+0.2),我们都知道是因为转换成二进制的时候产生无限循环小数,而js的尾数部分只能保存52位,出现截取取一舍零造成的;但是现在深挖一下:

const s = 0.1
console.log(s)//s=0.1    

console.log(0.1+5)//5.1

上述代码,s确准确的等于0.1,并没有出现精度不准确的情况,资料上说明,超过16位会使用toPrecision(16) 进行运算,进而会有 s=0.1的情况,那为什么0.1+0.2 不会做toPrecision的运算呢?

而对于第二种情况,我的猜测是对于整数和小数的相加,js会做toPrecision(m+1),m为小数的10的-m次方;
以上是我在研究js精度问题产生的两个问题,能够查到的博客上都对这两个方面没有说明,希望晓得js精度处理机制的大神帮助解答一下,谢谢大家!

补充:对于toPrecision(m)方法什么时候调用,更重要的是 m 的值是如何确定的?

阅读 1.2k
评论
    3 个回答

    对于你的问题,我在《你不知道JS》中卷第二章2.3.2 看到过这样的说法:

    0.1+0.2 === 0.3 //false

    从数学角度来说,上面的判断条件应该为true,可结果为什么是false呢?
    简单来说,二进制浮点数中的0.1和0.2并不是十分准确,他们相加的结果并非刚好等于0.3,而是一个比较接近的数字 0.30000000000000004,所以条件判断结果为false。有兴趣可以去看看《你不知道JS》