在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 的值是如何确定的?
JS 的数学运算都是基于 IEEE754 标准的浮点数运算,就算是
5+0.1
也都是浮点数5+浮点数0.1
。造成误差的原因就是
取一舍零
造成的误差不可被简单忽略。5+0.1 === 5.1
或其它类似的数学运算成立,是因为两边结果的浮点数真的就是相等了(符号位、阶数、尾数全部相同,也可能是细微的不同但是精度处理过后相同不过我不确定)。这个也并不定是对的,具体精度处理规则我也并不清楚,得看标准才行,有空我再去查查。