js浮点型精度

相信大家都碰到过这样一个问题,在js中为什么 0.1 + 0.2 == 0.3 结果是false,答案显而易见0.1+0.2的答案是0.30000000000000004,而0.15 + 0.25 == 0.4 却是true,当初百思不得其解,那为什么0.15 + 0.25 的答案却不会用17位的精度显示呢,所以一直在思考这个问题,买来的一些js书籍是这么描述的,"js的精度并不适用于特定的浮点数值",这就有些晦涩难懂了,然后就会陷入一个关于特定于非特定的怪圈.

这个问题应该从根源去解决,我们都知道,js的Number类型包含了整数值和浮点型,但是浮点型的占用内存却是整数值的俩倍,所以js处理浮点型的数值时会先对其进行取整处理,如果可以转换,那么就会作为整数来处理(例如:1.0 其实真正使用的是1 例如 .1 也是使用的1 因为js会自动过滤掉小数点后的第一位0值 如这样 1.01 那么就会作为真浮点型1.01来使用),js的整数仅仅是双精度浮点数的一个子集,不是单独的一个类型

回到刚才那个问题,这个问题首先要从数位表示法说起。今天我们看到的123这样的十进制数,是自然而然的理解其意义,但是有没有深究其内在的数学原理呢?

所谓十进制是0~9十个基本符号为基础的一种数字表示法,数位表示法是将一串基本符号从左到右连续排列的一种方法。为什么12时表示一十二,而不是二十一,或者是一加二的意思呢?因为数字所处的位置是有特别意义的,最右边第一个数字符号,代表基本的数0~9,而第二位的意义并不是0~9,而是0*10~9*10。推而广之,百位是x*100,(x是符号),用简练的数学公式就是x*10^k , 个位k是0,十位是1,百位k是2,从右到左一直数下去。123的意思就是1*10^2+2*10^1+3*10^0。

总结算术运算的过程就是,将操作数转换为整数,然后使用整数位模式进行运算,最后将结果转换为标准的js浮点数。

那么测试一下吧,(如下图所示,ps:不知道怎么排一行诶)



通过转换成分数再转换成32位浮点位可以看出其实得到的位数据(小数点后面的32位)转换成"整数",但真实的结果却是经过四舍五入得到的,尽管64位浮点数精度已经很高,但双精度浮点数也只能表示一组有限的数字,而不能表示所有的实数集。浮点运算只能产生近似的结果,四舍五入到最接近的可表示的实数。当你执行一系列的运算,随着舍入误差的积累,运算结果会越来越不精确。



但是对于之前0.15 + 0.25 以及上图这个0.28 + 0.23 却能正确表示,我的理解是当参与运算的浮点型数据精度高了,那么运算的结果可能会更加精确些吧.但是依旧无法保证其预算的精确度,故而在运算浮点型数据时可以转换成整数再换算成浮点型,避免js的内核通过位运算去"四舍五入",如下


有时候可以使用分数去判断(位判断还是云里雾里的赶脚),例如 3/10 != 0.3 ;但是 15/100 + 25/100 == 4/10 ,故而为真.

那么第一个博客就这么愉快的结束了,行动才是检验真理的唯一标准,可能我这个理解也是歪的,加油努力试着去理解一些更底层的东西吧,如果发现这个错了就跑回来改了吧.

                                                                                                                                                                                知错能改,用行动检验"真理"哈!

你可能感兴趣的:(js浮点型精度)