JS用64位来进行数字的表示,但是对于小数的表示却力不从心,即使对于我们最熟悉的小数表示起来都比较困难,当然是计算机本来就存在的问题。
如 0.1 +0.2=0.30000000000000004(JS的计算结果)。
出现这种结果的原因在于计算机本质上只能是存储0和1的,对于整数来说,使用十进制转换为二进制的方法是“除2取余,逆序排列”,表示起来毫无压力。
但是对于小数用二进制来表示,方法是不同的——"乘2取整,顺序排列"。
举个“栗子”:
将0.45进行二进制表示,
0.45*2=0.9 取整为0
0.9*2=1.8 取整为1
0.8*2=1.6 取整为1
0.6*2=1.2 取整为1
0.2*2=0.4 取整为0
...直到小数部分为0,显然这里会无限循环下去。‘
所以一般会取前面的十几位二进制数尽量接近表示0.45。
由于这种计算的规则,从而对于不等于1/2^n(n>=1,n为整数)的小数,二进制是不能精确表示的。
对于像金融类行业需要精确数字的,一般是需要要分数的形式表示相应小数的。