為什么說Number類型不老實呢,相信大家都多多少少的在開發(fā)中遇到過小數(shù)計算不精確的問題,比如0.1+0.2!==0.3 、0.1 + 0.7 !==0.8等,下面我們來追本溯源,看看為什么會出現(xiàn)這種現(xiàn)象,以及該如何避免。
精度丟失
計算機中所有的數(shù)據(jù)都是以二進制存儲的,所以在計算時計算機要把數(shù)據(jù)先轉(zhuǎn)換成二進制進行計算,然后在把計算結(jié)果轉(zhuǎn)換成十進制。
但在計算0.1+0.2時,二進制計算發(fā)生了精度丟失,導(dǎo)致再轉(zhuǎn)換成十進制后和預(yù)計的結(jié)果不符。
對結(jié)果的分析—更多的問題
0.1和0.2的二進制都是以1100無限循環(huán)的小數(shù),下面逐個來看JS幫我們計算所得的結(jié)果:
0.1的二進制:
0.0001100110011001100110011001100110011001100110011001101
0.2的二進制:
0.001100110011001100110011001100110011001100110011001101
理論上講,由上面的結(jié)果相加應(yīng)該::
0.0100110011001100110011001100110011001100110011001100111
實際JS計算得到的0.1+0.2的二進制
0.0100110011001100110011001100110011001100110011001101