0.1+0.2

在看js 的过程中发现了0.1加0.2不等于0.3,查了半天资料,总结一下免得忘记了…
可以阅读英文原文参考资料:参考资料

这个问题不仅仅存在于js,其他很多语言也有这个问题,这是使用基于IEEE754 数值的浮点计算的通病。

1.小数在计算机中的表示

首先,小数在计算机中按照二进制保存,如 0.5 表示为 0.1(2的-1次方) ,0.125表示为 0.001 (2 的 -3次方)。但是小数如果不是这些可以被2的负多少次方表示的数,那么二进制可能无法在有限位精确表示。

如0.1(十进制)表示为二进制就是:0.0001100110011001…

在IEEE754浮点数中,分为双精度和单精度两种类型,单精度32个比特存储,双精度浮点数64个比特存储。

这里讨论双精度小数。双精度小数64位按照科学计数法来保存小数。

由以下三部分组成(Sign:符号位 Exponent:指数位 Mantissa:尾数位)

在这里插入图片描述

Sign 符号位:

表示正负

Exponent 指数位:

数字的含义我的理解是 2的次方数。如指数位算出来是4就是二进制的2次方,是8就是二进制的三次方。
在这里插入图片描述
这里应该有11位,多一个指数位的符号位。所以二进制的-2次方指数位表示为 01111111011.

Mantissa尾数位:

保存的二进制数字,默认科学计数法第一个有效数字必定是1,因此这个1不储存。最大保存52位。

2. 0.1在计算机中的表示

0.1的二进制计算方式如下:
在这里插入图片描述
将每次乘2的整数位记录下来即0.1的二进制表示,计算如下:
在这里插入图片描述
那么写成科学计数法,表示如下:
在这里插入图片描述
指数位计算按照刚才所写,计算为:01111111011.
所以 64位 的 0.1 表示为:[符号位][尾数位][指数位]:
在这里插入图片描述
同理 0.2等于:在这里插入图片描述
加起来等于:
在这里插入图片描述

转换为十进制则为0.30000000000000004.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值