python中0.1+0.2为啥不等于0.3_你真的知道0.1+0.2为何不等于0.3吗?

在计算机中,0.1+0.2不等于0.3的原因源于浮点数的存储方式。浮点数使用IEEE标准的单精度和双精度格式,包含符号位、指数位和有效数位。由于无法精确表示某些小数,如0.1,导致计算时产生精度误差。此外,浮点数计算可能存在大数吃小数的问题,进一步影响精度。为避免精度丢失,金融等领域通常使用定点数或整数进行计算。
摘要由CSDN通过智能技术生成

打开chrome控制台,给一个特别简单的输入如下:0.1 + 0.2 // 0.30000000000000004 复制代码

不知道你有没有吃惊,这么简单的一个计算,无论在js中还是在python中,都不是准确的0.3,这是为什么呢?

缘起

要了解这个问题,首先我们需要知道浮点数在计算机中到底是如何进行存储的?不知道你是怎么想的,总之我开始的第一反应就是假设是32位的存储空间,我可能会按照整数的存储方式去想象,比如1-24位是整数位,剩余的8位代表小数,这样可以吗?当然是可以的,但是先考虑下下面的这个问题:

eff25557854d49c4b7fa4d2da9b6e744.png

想象红色区域是所能放置的数字的最大空间,现在有个问题,当我们想继续加0的时候,发现放不下了,因为空间是有限的,这个时候,我们会怎么办?

b96ecc484e809a99c0cc83cb971ddc4e.png

对,没错,科学计数法,就是我们在学习过程中,如果位数太多,我们一般都会用科学计数法来表示,这样的好处是,书写的位数小,表示的位数多,所以,回到计算机中,32位来表示实数的话,最多能表示多少位?2^32次方个,大约就是40亿,40亿数字很多吗?多,但是和无限多的实数集来比,沧海一粟,不够看的,所以计算机的设计者就要考虑这个问题了,如何让计算放下更多的数字?

真的有“定点数”

还记得上面说的,1-24表示整数位,剩余的表示小数位吗?这种存储方式就叫定点数,1-24位每4位表示一个0~9的数字的话,可以有6位表示整数部分,剩余2位表示小数部分,这样我们可以用32位表示从0到999999.99这样1亿个实数,这种用2进制来表示10进制的方式,叫做BCD编码(Binary-Coded Decimal),比如说8421码,从左往右的权依次是8,4,2,1,等等,有兴趣的可以去了解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值