当前位置: 首页 > Web前端 > CSS

js中0.1+0.2详解!=0.3

时间:2023-03-31 13:52:37 CSS

笔者在面试中被问到0.1+0.2的结果是什么。乍一看这道题,你可能心里想,不就是0.3吗?但是你肯定会觉得没那么简单,那么今天我们就来一探究竟。一、JavaScript中数字的存储机制在JavaScript中,数字是以IEEE754双精度64位浮点数的形式存储的(翻墙),其表示格式为:(s)*(m)*(2^e)其中,s代表符号位,m代表尾数,占52位,e代表指数,占11位。根据ECMAScript5规范,e的范围是[-1074,971],这样js能表示的最大值就是1*(2^53-1)*(2^971)=1.7976931348623157e+308,而这个值正是Number.MAX_VALUE的值;同理可以推导出js能表示的大于0的最小值是1*1*(2^-1074)=5e-324,正好是Number.MIN_VALUE的值。你可能注意到这里m是52位,可以表示的最大值是2^52-1,但是为什么这里是53呢?这涉及隐藏位。比如1*1.00111100*2^-3中,m表示1.00111100中的小数部分“00111100”,整数部分1为隐藏位。也就是说只要指数不全为0,那么它的隐藏位就是1。顺便说一句,js中可以精确表示整数的范围是-2^53+1~2^53-1.2.数字表示现在我们回到这个话题。我们知道在计算机中,数字是以二进制存储的,所以我们需要先将0.1和0.2转换成二进制。从十进制到二进制的转换,整数部分除以二,取余数。,倒序,小数部分乘以二,顺序排列,所以0.1转为二进制0.0001100110011001100110011...(0011循环)0.2转为二进制0.0011001100110011001100110011...(0011周期))然后然后我们的过过过说的的过的的说说过双双双双双双双双双双位位位位位位浮点数浮点数浮点数浮点数需需(需)e=-3;m=1.1001100110011001100110011001100110011001100110011010(52位)当然这里的m指的是小数点后52位,小数点前的整数部分1就是上面说的隐藏位。然后我们把它加起来。这里有个问题,就是指数不一致的时候怎么办。一般都是右移,因为即使右溢出,精度的损失也远小于左移时的溢出。e=-4;m=1.1001100110011001100110011001100110011001100110011010(52位)+e=-3;m=1.1001100110011001100110011001100110011001100110011010(52位)e=-3;m=0.1100110011001100110011001100110011001100110011001101(52位)+e=-3;m=1.1001100110011001100110011001100110011001100110011010(52位)e=-3;m=10.011001100110011001100110011001100110011001100111(52位)E=-2;M=1.00110011001100110011001100110011001100111(53位)我们看到了(52位以上),那这时候我们就疙瘩了。四舍五入可以最接近原始数字吗?例如1.101需要保留2位小数,那么结果可能是1.10和1.11。此时,两者同样接近。我们应该选择哪一个?规则是保留偶数,在本例中为1.10。回到我们之前的就是取m=1.0011001100110011001100110011001100110011001100110100(52位)然后我们得到最终的二进制数1.0011001100110011001100110011001100110011001100110100*2^-2=0.010011001100110011001100110011001100110011001100110100现在转化为十进制,二进制小数转化为十进制的方法是小数点后第一位*2^-1,theseconddigit*2^-2,andsoon.Intheend,weusethesumformulaofthegeometricsequencetogetthedecimalnumber0.30000000000000004,sothefinalresultof0.1+0.2is0.3000000000000000004.Thisisthewholereasoningprocess,IhopeyouwillalsoYoucantrytoreason.AlthoughthisisarelativelypartialknowledgeinJavaScript,itisstillgoodforunderstandingthestoragemechanismofcomputers.