fengmoliu

导航

JS小数精度问题

var two   = 0.2
var one   = 0.1
var eight = 0.8
var six   = 0.6
[two - one == one, eight - six == two]
0.2-0.1 //0.1
0.8-0.6 //0.20000000000000007
//答案是[true,false]

//要想后者为true
(0.8-0.6).toFixed(1)//0.2

JS不能很精确地表示小数。当两个浮点数相加或者相减,将有可能会导致精度丢失问题。

JS中的小数采用的是双精度(64位)表示的,由三部分组成:符 + 阶码 + 尾数,在十进制中的 1/10,在十进制中可以简单写为 0.1 ,但在二进制中,他得写成:0.0001100110011001100110011001100110011001100110011001……(后面全是 1001 循环)。因为浮点数只有52位有效数字,从第53位开始,就舍入了。这样就造成了“浮点数精度损失”问题。

通过上面分析,我们知道JS利用二进制存储的,所有的小数都可以用a0*(1/2)+a1*(1/4)+a2*(1/8)+…表示,这里(a0,a1,a2…只能取值0或者1),根据这个表达式我们发现0.1,0.2,0.6和0.8都是无限循环小数,但是0.2-0.1=0.1的原因是0.2是0.1的2倍,二进制乘2或者除2,左移或又移一位就行,所以0.2-0.1=0.1,但是0.8不是0.6的倍数,所以0.8-0.6!=0.2。

posted on 2022-05-28 21:37  冯沫流  阅读(514)  评论(0编辑  收藏  举报