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