js的精度丢失问题(及新手推理过程)

**

js的精度丢失问题(及新手推理过程)

**

(一)问题:为什么java与js计算0.1+0.2=0.30000000000000004?


首先我们要明白一切数在计算机的存储都是二进制的,就是计算机里只有01这两个数字
最肤浅的理解:十进制0.1转二进制 :0.000110011001100110011001100110011…无限循环
同样:十进制0.2转二进制 : 0.00110011001100110011001100110011…无限循环
所以:无限循环+无限循环=无限循环,所以二进制转十进制数时,有误差 ,而JavaScript 里的数字是采用 IEEE 754 标准的 64 位双精度浮点数,是有位数的,不可能无限循环下去的。

(二)但是我发现了问题…

在这里插入图片描述
0.4(十进制) = 0.0110011001100110…(二进制)
0.5(十进制)= 0.1(二进制)
不是应该是:无限循环的数+一个有限的数=无限循环的数吗?按道理0.5+0.4不应该等于0.9啊,应该等于一个像这样0.900000000003之类的

(三)求证事实

// 0.1 和 0.2 都转化成二进制后再进行运算
0.0001100110011001100110011001100110011001100110011001101 +
0.001100110011001100110011001100110011001100110011001101 =
0.010011001100110011001100110011001100110011001100110011

// 转成十进制正好是 0.30000000000000004

而0.5+0.4:0.01100110011001100110011001100110011001100110011001101+0.1=0.11100110011001100110011001100110011001100110011001101

// 转成十进制正好是 0.9
仅此而已

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值