摘要:什么是最大安全整數(shù)是一個(gè)值為的常量。因?yàn)榈臄?shù)字存儲(chǔ)使用了中規(guī)定的雙精度浮點(diǎn)數(shù)數(shù)據(jù)類型,而這一數(shù)據(jù)類型能夠安全存儲(chǔ)到之間的數(shù)值包含邊界值。
什么是最大安全整數(shù)?
MAX_SAFE_INTEGER 是一個(gè)值為 9007199254740991的常量。因?yàn)镴avascript的數(shù)字存儲(chǔ)使用了IEEE 754中規(guī)定的雙精度浮點(diǎn)數(shù)數(shù)據(jù)類型,而這一數(shù)據(jù)類型能夠安全存儲(chǔ) -(253 - 1) 到 253 - 1 之間的數(shù)值(包含邊界值)。--- MDN WEB DOCS在項(xiàng)目會(huì)導(dǎo)致什么錯(cuò)誤?
在代碼中輸出比MAX_SAFE_INTEGER大的Number值
console.log(9007199254740999) // 9007199254741000 console.log(9007199254740993) // 9007199254740992
在代碼中比較超出安全存儲(chǔ)的數(shù)值,可能會(huì)存在下列情況
9007199254740993 === 9007199254740992 // true實(shí)際項(xiàng)目中碰到的問(wèn)題
在進(jìn)行vue 項(xiàng)目開發(fā)的時(shí)候,通過(guò)axios進(jìn)行前后端數(shù)據(jù)交互
后端在定義某些數(shù)據(jù)時(shí)將數(shù)據(jù)的ID 設(shè)置為比MAX_SAFE_INTEGER大的int類型
而我取到后也沒有注意到這一情況,在修改某一條數(shù)據(jù)時(shí),是通過(guò)傳回?cái)?shù)據(jù)ID進(jìn)行數(shù)據(jù)定位的。
然后問(wèn)題就出現(xiàn)了。。。。
數(shù)據(jù)死活修改不了,后端返回?zé)o這條數(shù)據(jù),調(diào)試了半天,
然后通過(guò)對(duì)比preview 和 response 中的數(shù)據(jù)發(fā)現(xiàn)了兩者數(shù)據(jù)不一致
如何解決?第一個(gè)想法是在axios的攔截器中做處理,將數(shù)字類型轉(zhuǎn)換為字符串
9007199254740993 => "9007199254740993"
但經(jīng)過(guò)嘗試后發(fā)現(xiàn)axios攔截器中的數(shù)據(jù)本身就是錯(cuò)誤了。
然后就用了原生的fetch 做處理
export function getData(data) { const promise = new Promise(function (resolve, reject) { const headers = new Headers() headers.append("Content-Type", "application/json") const config = { method: "POST", headers, body: JSON.stringify(data) } fetch("api/url", config).then(res => res.text()).then(text => { function numberToString (match) { return `:"${match.substring(1, match.length - 1)}",` } const responseJson = JSON.parse(text.replace(/:d{15,100},/g, numberToString)) resolve(responseJson) }) }) return promise }
但問(wèn)題是這個(gè)只解決了一個(gè)api 的問(wèn)題,然后每個(gè)都這樣寫,太煩了。
而且fetch 并沒有axios中的攔截器,不能統(tǒng)一處理異常
所有便想要自己封裝一個(gè)fetch通過(guò)模仿axios 那樣設(shè)置攔截器之類的功能。。。。。。
然后就沒有然后了,感覺封裝一個(gè)目前需要的fetch會(huì)花個(gè)半天到一天的時(shí)間。
而且又快下班了,所以就去看axios文檔了。
發(fā)現(xiàn)axios文檔中已經(jīng)有這樣一個(gè)回調(diào)函數(shù),能解決這個(gè)問(wèn)題
// `transformResponse` allows changes to the response data to be made before // it is passed to then/catch transformResponse: [function (data) { // Do whatever you want to transform the data return data; }],
這個(gè)不看文檔的壞習(xí)慣,浪費(fèi)了大半天時(shí)間
最后代碼
const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // api 的 base_url timeout: 5*1000, // request timeout transformResponse: [function (data) { function numberToString (match) { return `:"${match.substring(1, match.length - 1)}",` } if (isJSON(data)) { const responseJson = JSON.parse(data.replace(/:d{15,100},/g, numberToString)) return responseJson } else { return data } }] })總結(jié)
第一,我這個(gè)數(shù)據(jù)是json類型的的所以在取到原始數(shù)據(jù)就是字符串,其實(shí)是對(duì)字符串進(jìn)行處理
第二,最后的方案不是最優(yōu)的,應(yīng)為這個(gè)會(huì)處理每一條數(shù)據(jù),不管那條數(shù)據(jù)中有沒有超出范圍的數(shù)字
第三,能想到的比較好的方案是和后端對(duì)接時(shí)問(wèn)清楚那些是超出的,然后將這兩種情況區(qū)分開來(lái),再使用不同的axios 封裝
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/109893.html
摘要:本文通過(guò)介紹的二進(jìn)制存儲(chǔ)標(biāo)準(zhǔn)來(lái)理解浮點(diǎn)數(shù)運(yùn)算精度問(wèn)題,和理解對(duì)象的等屬性值是如何取值的,最后介紹了一些常用的浮點(diǎn)數(shù)精度運(yùn)算解決方案。浮點(diǎn)數(shù)精度運(yùn)算解決方案關(guān)于浮點(diǎn)數(shù)運(yùn)算精度丟失的問(wèn)題,不同場(chǎng)景可以有不同的解決方案。 本文由云+社區(qū)發(fā)表 相信大家在平常的 JavaScript 開發(fā)中,都有遇到過(guò)浮點(diǎn)數(shù)運(yùn)算精度誤差的問(wèn)題,比如 console.log(0.1+0.2===0.3)// fa...
摘要:表達(dá)式?jīng)]有返回值,因此返回結(jié)果是。并不改變表達(dá)式的結(jié)果,只要讓表達(dá)式不返回值按慣例我們用來(lái)獲得這主要源自語(yǔ)言,當(dāng)然使用或其他表達(dá)式也是可以的。不是數(shù)字的數(shù)字如果數(shù)學(xué)運(yùn)算的操作數(shù)不是數(shù)字類型,就無(wú)法返回一個(gè)有效的數(shù)字,這種情況下返回值為。 這里的內(nèi)容是讀書筆記,僅供自己學(xué)習(xí)所用,有欠缺的地方歡迎留言提示。 第一部分 類型和語(yǔ)法 第1章 類型ECMAScript語(yǔ)言類型包括Undefin...
摘要:推導(dǎo)為何等于在中所有數(shù)值都以標(biāo)準(zhǔn)的雙精度浮點(diǎn)數(shù)進(jìn)行存儲(chǔ)的。先來(lái)了解下標(biāo)準(zhǔn)下的雙精度浮點(diǎn)數(shù)。精度位總共是,因?yàn)橛每茖W(xué)計(jì)數(shù)法表示,所以首位固定的就沒有占用空間。驗(yàn)證完成的最大安全數(shù)是如何來(lái)的根據(jù)雙精度浮點(diǎn)數(shù)的構(gòu)成,精度位數(shù)是。 閱讀完本文可以了解到 0.1 + 0.2 為什么等于 0.30000000000000004 以及 JavaScript 中最大安全數(shù)是如何來(lái)的。 十進(jìn)制小數(shù)轉(zhuǎn)為二...
摘要:本文是重溫基礎(chǔ)系列文章的第六篇。以指定的精度返回該數(shù)值對(duì)象的字符串表示,可接收一個(gè)參數(shù),用來(lái)指定有效數(shù)個(gè)數(shù)的整數(shù)。 本文是 重溫基礎(chǔ) 系列文章的第六篇。今日感受:自己需要多總結(jié),會(huì)有不同收獲(比如今晚我做的轉(zhuǎn)正總結(jié))。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1.語(yǔ)法和數(shù)據(jù)類型 【重溫基礎(chǔ)】2.流程控制和錯(cuò)誤處理 【重溫基礎(chǔ)】3.循環(huán)和...
摘要:的二進(jìn)制科學(xué)計(jì)數(shù)法第位是,所以就有了下面的結(jié)果有著同樣的問(wèn)題,其實(shí)正是由于這樣的存儲(chǔ),在這里有了精度丟失,導(dǎo)致了。最大安全數(shù)字中表示最大安全數(shù)字計(jì)算結(jié)果是,即在這個(gè)數(shù)范圍內(nèi)不會(huì)出現(xiàn)精度丟失小數(shù)除外這個(gè)數(shù)實(shí)際上是。是一個(gè)任意精度的整數(shù)。 話不多說(shuō),先上代碼 function judgeFloat(n, m) { const binaryN = n.toString(2...
閱讀 1019·2022-07-19 10:19
閱讀 1794·2021-09-02 15:15
閱讀 1007·2019-08-30 15:53
閱讀 2652·2019-08-30 13:45
閱讀 2651·2019-08-26 13:57
閱讀 1983·2019-08-26 12:13
閱讀 1005·2019-08-26 10:55
閱讀 545·2019-08-26 10:46