在做題的時(shí)候遇到一個(gè)好玩的問題:
題目
鑒于這一系列題目答案都比較出人意料恃锉,加上隱隱感覺2^53可能達(dá)到JS中數(shù)值的一個(gè)極限我選了other壶冒,算是蒙對(duì)了福青,但是究竟是為什么呢眼刃?
參考答案中提示說是2^53是JS中可能取到的最大值绕辖,覺得哪里怪怪的,自己試試水:
Chrome測(cè)試結(jié)果
可以看到+1的時(shí)候沒有變化擂红,而+2和+10086則取到了更大的值仪际。有貓膩?
搜集資料得到的結(jié)論:
- JS中只有一種類型數(shù)昵骤,即64位(1bit 的符號(hào)位树碱,11bits 的指數(shù)部分 ,以及52bits 的小數(shù)部分)雙精度浮點(diǎn)數(shù)变秦,當(dāng)整數(shù)數(shù)值過大時(shí)成榜,就會(huì)發(fā)生精度丟失。
- 所謂安全整數(shù)即能夠唯一確定的數(shù)字蹦玫,即能夠使用64位二進(jìn)制數(shù)唯一確定的整數(shù)赎婚。考慮253钳垮,轉(zhuǎn)換成對(duì)應(yīng)表示方式后其小數(shù)部分總共包括53位惑淳,發(fā)生了精度丟失,所以在JS中無(wú)法區(qū)別253與2^53+1;
- 安全整數(shù)與JS是否能夠正確進(jìn)行運(yùn)算關(guān)系密切饺窿,當(dāng)運(yùn)算數(shù)與運(yùn)算結(jié)果都處于安全整數(shù)的范圍內(nèi)時(shí)歧焦,才能保證JS運(yùn)算結(jié)果正確。
參考資料
https://www.zhihu.com/question/29010688
http://2ality.com/2013/10/safe-integers.html
http://2ality.com/2012/04/number-encoding.html