为什么当我们使用电脑浏览器计算0.2+0.1的时候,结果却是0.30000000000000004,这个问题其实一直是一个经典的问题,甚至有一个网站的域名就是:https://0.30000000000000004.com/,但是全英文的,不适合大多数中国的程序员。然后我又找了很多资料,发现说与计算机的存储方式有关系,什么IEEE754;还是一头雾水,不好理解。今天我来给大家分享一下我的理解
首先:十进制怎么转二进制
对于整数部分:除以2 取余数,一直进行下去【除2取余】
对于小数部分:乘以2 取整数,继续小数部分乘以2 取整数,直到小数部分为0【乘2取整】
规则是这样的,但是不好理解,下面我们先反着看:
我们先来看 十进制能怎么转化
【123 => 1*100+2*10+3*1】
10**2 10**1 10**0
【0.123】 = > 1/10 + 2/100 +3/1000
10**-1 10**-2 10**-3
我们再来看看二进制怎么转为十进制:
110 ====>1*(2**2) + 1*(2**1) + 0*(2**0) = 6
0.101====>1*(2**-1) + 0*(2**-2) + 1*(2**-3) = 0.625
然后总结规律,从右边向左边看
第一条:是不是刚好符合 除以2 取余数
第二条:是不是刚好符合 乘以2 取整数
然后:我们来看看 :0.1和0.2
最后总结:很显然,两个都是截取数据,所以就变得不精准了
比如一个数 1÷3=0.33333333...... 大家都知道3会一直无限循环,数学可以表示,但是计算机要存储,方便下次取出来再使用,但0.333333...... 这个数 无限循环,你让计算机怎么存储?计算机再大的内存它也存不下,对吧! 所以不能存储一个相对于数学来说的值,只能存储一个近似值,所以当计算机存储后再取出来用时就会出现精度问题。
解决方案:
math.js 或 BigNumber.js
【他的大概原理是将所有数字当做字符串,重新实现了计算逻辑】
更多同步知识分享