为什么浮点型运算结果会有误差?

如var a=0.65;

var b=0.6;

console.log(a-b)==0.05???错   a-b=0.050000000000000044

为什么?

其根本原因在于计算机所使用的01代码无法准确地表示某些带小数的十进制数据。

下面我们来分析下:

我们知道将一个十进制数值转换为二进制数值,需要通过下面的计算方法:

1. 整数部分:连续用该整数除以2,取余数,然后商再除以2,直到商等于0为止。然后把得到的各个余数按相反的顺序排列。简称"除2取余法"。

2. 小数部分:十进制小数转换为二进制小数,采用"乘2取整,顺序排列"法。用2乘以十进制小数,将得到的整数部分取出,再用2乘余下的小数部分,然后再将积的整数部分取出,如此进行,直到积中的小数部分为0或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,即先取出的整数部分作为二进制小数的高位,后取出的整数部分作为低位有效位。简称"乘2取整法"。

3. 含有小数的十进制数转换成二进制,整数、小数部分分别进行转换,然后相加。

例如:将十进制数值25.75转换为二进制数值,步骤如下:

25(整数部分)

25/2=12…1

12/2=6…0

6/2=3…0

3/2=1…1

1/2=0…1

(25) 10=(11001) 2

0.75(小数部分)

0.75*2=1.5…1

0.5*2=1…1

(0.75) 10=(0.11) 2

(25.75) 10=(11001) 2+(0.11) 2=(11001.11) 2

按照上述方法,我们将0.65及0.6转换为二进制代码:

(0.65)10 = (0.101001100110011001100110011001100110011…)2

(0.6) 10 = (0.10011001100110011001100110011001100110011…)2

后面的省略号表示已经算不完了,后面在无限重复 0011 这段二进制数值。

因为浮点型只能存储32位,所以会进行截取,截取后的二进制代码已无法准确表示0.65和0.6,所以无法得到正确的结果

解决方法:因为二进制数可以准确表示整数,所以可以先将小数乘10或100等变成整数,然后做运算,最后再通过除以10或100来获得结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值