红宝书上有一个经典的例子,0.1+0.2!=0.3,当第一次看到的时候,百思不得其解,虽然知道浮点数在计算机中是如何存储的,但并不知道为何会出现这种情况

首先要知道,数值在计算机中是转化为二进制数字进行保存的,然后就要讲到关于十进制转二进制小数部分的转换方法了。
以0.1为例:
0.1*2=0.2 取0
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
0.4*2=0.8 取0
0.8*2=1.6 取1
。。。
最终得到的二进制数为0.00011001100110011...这样得到的是一个有无穷位数的二进制数字,而保存一个数据不可能用无穷的空间去存储,这就会导致计算机舍去后面的数值,从而我们得到的就是这个数值的近似值了。
而js的IEEE754标准也是如此,这导致了js会对一些小数取近似值,0.1和0.2转换成二进制都是无穷数,从而导致了0.1+0.2≠0.3。

解决该问题的方法:将小数变成整数计算,然后再换回小数,例如0.1+0.2=(0.1*10+0.2*10)/10

Last modification:July 26th, 2021 at 10:46 am
如果觉得我的文章对你有用,请随意赞赏