0.1+0.2不等于0.3

关于计算机中0.1+0.2不等于0.3的问题

先看一下浏览器给出的结果:
在这里插入图片描述
可以看到我们的浏览器在运算0.1+0.2的时候是得不到0.3的。
那么为什么?
这是因为在我们的JavaScript语言中,内部的计算都是采用二进制进行计算的。那么我们在进行0.1+0.2时需要先做一个进制转换。
十进制转二进制非小数采用除二取余,小数采用乘二取整。
0.1的二进制:0.0001 1001 1001 1001…
0.2的二进制:0.0011 0011 0011 0011…
它们的二进制都是无穷的。在我们的现代浏览器中,我们是以浮点数的方式来存储二进制的,因此我们还需要将其转换为浮点数

单精度浮点数在机内占4个字节、有效数字8位、表示范围:-3.40E+38 ~ +3.40E+38,对应32位操作系统
双精度浮点数在机内占8个字节、有效数字16位、表示范围:-1.79E+308 ~ +1.79E+308,对应64位操作系统

目前大多操作系统都是64位的,故我们以64位操作系统为例

  • 双精度浮点数用1位表示符号位,11位表示指数位,52位表示小数位,共计64位

单精度1位符号位,8位指数位,23位小数位,共计32位

  • 符号位:0表示正数,1表示负数
  • 指数位:阶数与偏移量
  • 小数位:二进制小数点后面的数

在这里插入图片描述
0.1转换成浮点数:
在这里插入图片描述
0.2转换成浮点数:
在这里插入图片描述
然后两个浮点数相加,相加的时候,先比较指数位是否一样,如果一样,则小数位相加,如果不一样,需要调整指数位
相加之后的浮点数如下:
在这里插入图片描述
然后我们将这个浮点数转成十进制数,二进制浮点数转十进制公式为:
在这里插入图片描述
s为符号位,e为浮点数指数位转成十进制的值,i表示小数位从左到右的位数,Mi表示每一位的值,得到结果:
0.3000000000000000444089209850062616169452667236328125
最后取得:
0.30000000000000004


既然与这样的结果,那么实际页面中就可能会带来一些Bug,特别是对于一些商户页面,存在一些金额0.01,0.02这样的金额,就容易引起页面样式的错乱。那么可以怎么解决呢?
在JavaScript中,数学函数库Math.js提供了很多方法,可以用Math.round来解决精度误差,比如要把 2.55 四舍五入保留 1 位小数,先把 2.55∗10 得到 25.5 ,再用Math.round取整25.5 ,会得到25,再把 25÷10 得到 2.5 ,就这样间接实现了四舍五入。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值