摘要:今天遇到個(gè)問(wèn)題后端設(shè)置了一個(gè)數(shù)字在中。果不其然,的輸出是。很明顯,這應(yīng)該是溢出的問(wèn)題,能處理的數(shù)字都是浮點(diǎn)數(shù),超出范圍則會(huì)忽略了。
今天遇到個(gè)問(wèn)題:后端設(shè)置了一個(gè) id=32132132132132112(數(shù)字) 在 cookie 中。
我為了偷懶,用了個(gè)第三方組件去解析 cookie,然后發(fā)現(xiàn)這個(gè)數(shù)字被解析出來(lái)變成了 32132132132132110
百思不得其解,這么一個(gè)簡(jiǎn)單的 cookie parse 的組件怎么會(huì)發(fā)生這么奇怪的問(wèn)題。
翻了下源碼發(fā)現(xiàn)有這么一句:JSON.parse(xxx)。
果不其然,JSON.parse(32132132132132112) 的輸出是 32132132132132110。
很明顯,這應(yīng)該是溢出的問(wèn)題,JS 能處理的數(shù)字都是浮點(diǎn)數(shù),超出范圍則會(huì)忽略了。
JS中整數(shù)的數(shù)字范圍是 -2^53~2^53, 超出則視為 2^53 處理,注意這個(gè)并不會(huì)報(bào)錯(cuò),所以如果你在使用巨型數(shù)字前沒(méi)有意識(shí)到這個(gè)問(wèn)題,意味著項(xiàng)目上線后,你將可能丟失用戶(hù)數(shù)據(jù)。
所以遇到這種問(wèn)題,要么限制數(shù)字輸入在可控范圍內(nèi),要么在不需要計(jì)算的時(shí)候,將這種數(shù)字串存為字符串,要么使用一些能處理巨型計(jì)算的庫(kù)來(lái)解決問(wèn)題,比如 https://github.com/jtobey/javascript-bignum 或 https://www.npmjs.com/package/json-bigint
參考資料:https://www.irt.org/script/1031.htm
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79857.html
摘要:直到有一天你會(huì)碰到線上奇奇怪怪的問(wèn)題,如線程執(zhí)行一個(gè)任務(wù)遲遲沒(méi)有返回,應(yīng)用假死。正好這次借助之前的一次生產(chǎn)問(wèn)題來(lái)聊聊如何排查和解決問(wèn)題。本地模擬上文介紹的是線程相關(guān)問(wèn)題,現(xiàn)在來(lái)分析下內(nèi)存的問(wèn)題。盡可能的減少多線程競(jìng)爭(zhēng)鎖。 showImg(https://segmentfault.com/img/remote/1460000015568421?w=2048&h=1150); 前言 之前或...
摘要:堆堆是用來(lái)存儲(chǔ)對(duì)象實(shí)例的因此如果我們不斷地創(chuàng)建對(duì)象并且保證和創(chuàng)建的對(duì)象之間有可達(dá)路徑以免對(duì)象被垃圾回收那么當(dāng)創(chuàng)建的對(duì)象過(guò)多時(shí)會(huì)導(dǎo)致內(nèi)存不足進(jìn)而引發(fā)異常上面是一個(gè)引發(fā)異常的代碼我們可以看到它就是通過(guò)不斷地創(chuàng)建對(duì)象并將對(duì)象保存在中防止其被 Java 堆 OutOfMemoryError Java 堆是用來(lái)存儲(chǔ)對(duì)象實(shí)例的, 因此如果我們不斷地創(chuàng)建對(duì)象, 并且保證 GC Root 和創(chuàng)建的對(duì)象...
摘要:對(duì)之前看高級(jí)程序設(shè)計(jì)時(shí)沒(méi)有注意到的一些知識(shí)點(diǎn),結(jié)合本書(shū)做以補(bǔ)充語(yǔ)法注釋源于的型既可以出現(xiàn)在字符串字面量中,也可能出現(xiàn)在正則表達(dá)式字面量中,如故一般建議使用型注釋保留字語(yǔ)句變量參數(shù)屬性名運(yùn)算符和標(biāo)記等標(biāo)識(shí)符不允許使用保留字,此外在對(duì)象字面量中 對(duì)之前看《JavaScript高級(jí)程序設(shè)計(jì)》時(shí)沒(méi)有注意到的一些知識(shí)點(diǎn),結(jié)合本書(shū)做以補(bǔ)充 語(yǔ)法 注釋 源于PL/I的/* */型既可以出現(xiàn)在字符串字...
摘要:浮點(diǎn)數(shù)并不是能夠精確表示范圍內(nèi)的所有數(shù)的,雖然浮點(diǎn)型的范圍看上去很大。但其實(shí)浮點(diǎn)數(shù)在保存數(shù)字的時(shí)候做了規(guī)格化處理,以進(jìn)制為例小數(shù)點(diǎn)前只需要保留位數(shù)對(duì)于二進(jìn)制來(lái)說(shuō),小數(shù)點(diǎn)前保留一位,規(guī)格化后始終是節(jié)省了,這個(gè)并不需要保存。 JS 中的最大安全整數(shù)是多少? JS 中所有的數(shù)字類(lèi)型,實(shí)際存儲(chǔ)都是通過(guò) 8 字節(jié) double 浮點(diǎn)型 表示的。浮點(diǎn)數(shù)并不是能夠精確表示范圍內(nèi)的所有數(shù)的, 雖然 ...
閱讀 1500·2023-04-25 15:40
閱讀 2881·2021-08-11 11:15
閱讀 2284·2019-08-26 13:48
閱讀 2861·2019-08-26 12:18
閱讀 2461·2019-08-23 18:23
閱讀 2916·2019-08-23 17:01
閱讀 2990·2019-08-23 16:29
閱讀 1109·2019-08-23 15:15