0.1+0.2不等于0.3核行?是不是有點(diǎn)顛覆你的認(rèn)知精算,但是伯病,在js中,是真實(shí)存在的明场!
console.log(0.1+0.2); // 0.30000000000000004
其實(shí)這都是因?yàn)楦↑c(diǎn)數(shù)運(yùn)算的精度問題汽摹。
簡單來說,因?yàn)橛?jì)算機(jī)只認(rèn)識(shí)二進(jìn)制苦锨,在進(jìn)行運(yùn)算時(shí)逼泣,需要將其他進(jìn)制的數(shù)值轉(zhuǎn)換成二進(jìn)制,然后再進(jìn)行計(jì)算舟舒。
由于浮點(diǎn)數(shù)用二進(jìn)制表達(dá)時(shí)是無窮的:
// 將0.1轉(zhuǎn)換成二進(jìn)制
console.log(0.1.toString(2)); // 0.0001100110011001100110011001100110011001100110011001101
// 將0.2轉(zhuǎn)換成二進(jìn)制
console.log(0.2.toString(2)); // 0.001100110011001100110011001100110011001100110011001101
IEEE 754 標(biāo)準(zhǔn)的 64 位雙精度浮點(diǎn)數(shù)的小數(shù)部分最多支持53位二進(jìn)制位拉庶,所以兩者相加后,因浮點(diǎn)數(shù)小數(shù)位的限制而截?cái)嗟亩M(jìn)制數(shù)字魏蔗,再轉(zhuǎn)換為十進(jìn)制,就成了 0.30000000000000004痹筛,所以在進(jìn)行算術(shù)計(jì)算時(shí)會(huì)產(chǎn)生誤差莺治。
64位比特又可分為三個(gè)部分:
符號(hào)位S:第 1 位是正負(fù)數(shù)符號(hào)位(sign),0代表正數(shù)帚稠,1代表負(fù)數(shù)
指數(shù)位E:中間的 11 位存儲(chǔ)指數(shù)(exponent)谣旁,用來表示次方數(shù)
尾數(shù)位M:最后的 52 位是尾數(shù)(mantissa),超出的部分自動(dòng)進(jìn)一舍零