解決超出JS的安全整數(shù)的限制范圍問題
解決超出JS的安全整數(shù)的限制范圍
JavaScript 能夠準(zhǔn)確表示的整數(shù)范圍在-2^53到 2^53之間,超過這個(gè)范圍,無法精確表示這個(gè)值。
Number.MIN_SAFE_INTEGER //-9007199254740991 Number.MAX_SAFE_INTEGER // 9007199254740991
此時(shí)用到 json-bigint將后端返回?cái)?shù)據(jù)處理處理之后才能正常使用:
- 1.項(xiàng)目需要安裝的依賴
> npm i json-bigint
- 2.引入json-bigint文件
>import JSONbig from 'json-bigint'
transformResponse是將后端返回的原始數(shù)據(jù)進(jìn)行處理
下面使用 : try-catch 來捕獲異常
因?yàn)椋汉蠖朔祷氐臄?shù)據(jù)可能不是 JSON 格式字符串,如果不是則將data數(shù)據(jù)原封不動(dòng)的直接返回給請(qǐng)求使用
const request = axios.create({ baseURL: '', // 請(qǐng)求的基礎(chǔ)路徑 transformResponse: [function (data) { try { return JSONbig.parse(data) } catch (err) { return data } }] })
請(qǐng)求回來的數(shù)據(jù)使用.toString() 即可獲取
request({ method:'GET',//請(qǐng)求方法 url:'',//請(qǐng)求路徑 params: {},//請(qǐng)求參數(shù)拼接在url上面 }).then(res=>{ console.log(res.data.id.toString()) })
JS實(shí)現(xiàn)超范圍的數(shù)相加
在js中能表示的最大安全整數(shù)是 9007199254740991,可以用API Number.MAX_SAFE_INTEGER
看一下
超出范圍就會(huì)發(fā)生精度丟失,像這樣
解決方法
相當(dāng)于一個(gè)字符串相加的問題。不能把數(shù)字簡(jiǎn)單的相加,需要倒序取數(shù)字的每一位,進(jìn)行相加,大于等于10,進(jìn)1,小于10,進(jìn)0,把結(jié)果保存在一個(gè)字符串中。
注意點(diǎn):
- 1、要考慮長(zhǎng)度不一樣
- 2、要考慮進(jìn)位,所以需要倒序來相加
代碼如下:
function add(a,b){ // 保存最終結(jié)果 var res=''; // 保存兩位相加的結(jié)果 和 進(jìn)位值 var c=0; // 字符串轉(zhuǎn)數(shù)組 a = a.split(''); b = b.split(''); while (a.length || b.length || c){ // ~~ 用來把String類型 轉(zhuǎn)為 Number類型 // 把兩位相加的結(jié)果 和 進(jìn)位值相加 // pop方法返回?cái)?shù)組的最后一位,并刪除 c += ~~a.pop() + ~~b.pop(); // 取余,把余數(shù)拼接到最終結(jié)果中 res = c % 10 + res; // 保存進(jìn)位,true 或者 false c = c>9; } return res; } add('11111111111111111','22222222222222222');
解釋:
1、~
是JavaScript中的操作符,按位非
~~
經(jīng)常用來進(jìn)行取整和類型轉(zhuǎn)換,他和顯示的用Number進(jìn)行類型轉(zhuǎn)換還是有區(qū)別的,比如處理 undefined
的時(shí)候。
而在兩個(gè)大整數(shù),長(zhǎng)度不一樣的時(shí)候,其中一個(gè)數(shù) 已經(jīng) pop 了所有數(shù)組中的元素之后,還要pop的話,就會(huì)返回 undefined
,所以如果用 Number 顯示的轉(zhuǎn)化,起碼要寫成這樣。
var ai = a.pop(); ai = ai===undefined? 0:Number(ai); var bi = b.pop(); bi = bi===undefined? 0:Number(bi); c += ai + bi;
明顯是用 ~~
方便。
2、在保存進(jìn)位值的時(shí)候,用的并不是 1 和 0 ,而是true 和 false,這是因?yàn)殡[式類型轉(zhuǎn)換的時(shí)候,true會(huì)轉(zhuǎn)為1,false會(huì)轉(zhuǎn)為0。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Fetch超時(shí)設(shè)置與終止請(qǐng)求詳解
這篇文章主要給大家介紹了關(guān)于Fetch超時(shí)設(shè)置與終止請(qǐng)求的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Fetch具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05layui-table表復(fù)選框勾選的所有行數(shù)據(jù)獲取的例子
今天小編就為大家分享一篇layui-table表復(fù)選框勾選的所有行數(shù)據(jù)獲取的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09用javascript實(shí)現(xiàn)記錄來賓姓名的代碼
用javascript實(shí)現(xiàn)記錄來賓姓名的代碼...2007-03-03iframe父頁(yè)面獲取子頁(yè)面參數(shù)的方法
這篇文章主要介紹了iframe父頁(yè)面獲取子頁(yè)面參數(shù)的方法,需要的朋友可以參考下2014-02-02JS中使用TextDecoder解碼二進(jìn)制數(shù)據(jù)(數(shù)據(jù)流的逐步解碼)
JS中使用TextDecoder將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為可讀文本字符串,首先,創(chuàng)建TextDecoder對(duì)象,使用decode()方法,解碼為字符串,,{stream:true}選項(xiàng)允許處理流式數(shù)據(jù),適用于大型數(shù)據(jù)流的逐步解碼,TextDecoder廣泛應(yīng)用于WebSocket通信、文件讀取、網(wǎng)絡(luò)響應(yīng)等場(chǎng)景2024-10-10TypeScript中定義變量方式以及數(shù)據(jù)類型詳解
TypeScript支持 JavaScript的所有語法和語義,同時(shí)通過作為ECMAScript的超集來提供一些額外的功能,如類型檢測(cè)和更豐富的語法,這篇文章主要給大家介紹了關(guān)于TypeScript中定義變量方式以及數(shù)據(jù)類型詳解的相關(guān)資料,需要的朋友可以參考下2022-08-08使用HTML5+Boostrap打造簡(jiǎn)單的音樂播放器
這篇文章主要介紹了使用HTML5+Boostrap打造簡(jiǎn)單的音樂播放器 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08