最近在学习JS过程中发现了一个非常有意思事,就是运算0.1+0.2的结果不是0.3,而是0.30000000000000004,但先将小数做乘法然后相加,再除回来就得到想要的0.3
我用python试了一下,发现python也是一样的,结果也是0.30000000000000004。
然后我开始信息搜集,最后找到了答案。想知道这其中的原因,要先理解这些点:二进制、指数形式、IEEE 754标准。
1、二进制
在计算机中所有的数据都是二进制形式存储的,包括整数、浮点数以及其他所有类型的数据。我们将十进制的0.1以及0.2转换成二进制
转换的方法也比较简单,整数转换成二进制:就是用整数除以2然后从下往上取余数,下图用100举例
然后小数转换成二进制就是,小数部分无限乘以2,然后顺序取整。下图用0.375举例
2、指数形式
用指数方式表示可以在有限的空间里存储更大的数值。
所有的十进制数都可以用指数形式表示,成为D=M*10E,比如100可以表示为1*102。
二进制数也可以用指数形式表示,B=M*2E的形式,这里的E为指数,M为B的位数。比如0.011可以表示为1.1*10-10,这里的“-10”表示的是-2。
3、浮点数IEEE754标准