打开chrome控制台,给一个特别简单的输入如下:0.1 + 0.2 // 0.30000000000000004 复制代码
不知道你有没有吃惊,这么简单的一个计算,无论在js中还是在python中,都不是准确的0.3,这是为什么呢?
缘起
要了解这个问题,首先我们需要知道浮点数在计算机中到底是如何进行存储的?不知道你是怎么想的,总之我开始的第一反应就是假设是32位的存储空间,我可能会按照整数的存储方式去想象,比如1-24位是整数位,剩余的8位代表小数,这样可以吗?当然是可以的,但是先考虑下下面的这个问题:
想象红色区域是所能放置的数字的最大空间,现在有个问题,当我们想继续加0的时候,发现放不下了,因为空间是有限的,这个时候,我们会怎么办?
对,没错,科学计数法,就是我们在学习过程中,如果位数太多,我们一般都会用科学计数法来表示,这样的好处是,书写的位数小,表示的位数多,所以,回到计算机中,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,等等,有兴趣的可以去了解