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

浅剖面0.1+0.2=-

时间:2023-03-27 15:59:14 JavaScript

可追溯的数字计算机是以二进制存储的,所以这里我们需要知道十进制转二进制的规则,二进制转十进制的规则。小数转二进制:乘以2取整,正序这两句话怎么理解:比如数字9.375,整数是9,小数是0.375。整数9转换成二进制是:1001,那么十进制0.375转换成二进制是:011,那么9.375二进制就是1001.011可以用下面的方法验证console.log((9.375).toString(2))console.log(Number.prototype.toString.call(9.375,2));console.log(Number.prototype.toString.call(Number(9.375),2));小数点前相同的二进制转换:从右到左,将每个二进制数乘以对应的2的次方递增小数点后:从左到右,将每个二进制数乘以2的对应的负次方递增IEEE754双精度64位浮点十进制有科学计数法:所以0.1的二进制e=-4;1.1001100110011001100110011001100110011001100110011010(52位)然后我们把它加起来。这里有个问题,就是指数不一致的时候,通常是右移,因为即使右移溢出,精度的损失也远小于左移转换为e=-时的溢出3;m=0.1100110011001100110011001100110011001100110011001101(52位)+e=-3;m=1.1001100110011001100110011001100110011001100110011010(52位)得到e=-3;m=10.0110011001100110011001100110011001100110011001100111(52位)保留一位整数e=-2;m=1.00110011001100110011001100110011001100110011001100111(53位)超过了52位,做四舍五入舍入与原来的数最接近的,原则是保留偶数最终的二进制数1.0011001100110011001100110011001100110011001100110100*2^-2=0.010011001100110011001100110011001100110011001100110100转化为十进制为0.30000000000000004如何避免这个事情的发生我们认为可以ThenumberIunderstandisaninfinitelyrecurringdecimalinsidethecomputer.Ithasnowaytodoit.Themantissaofitsmantissaisonly52bits.Itcanonlybetruncatedandnormalized.Whenitisrounded,itmaycauseaprecisionloss.Deviation,sowhatisobtainedisarelativelyaccurateresultbutnotabsolutelyaccurate.Isthereanywaytomake0.1+0.2equalto0.3(0.2*100+0.1*100)/100,thatistoavoiddecimalplaceswhencalculating