解決超出JS的安全整數(shù)的限制范圍問題
解決超出JS的安全整數(shù)的限制范圍
JavaScript 能夠準(zhǔn)確表示的整數(shù)范圍在-2^53到 2^53之間,超過這個范圍,無法精確表示這個值。
Number.MIN_SAFE_INTEGER //-9007199254740991 Number.MAX_SAFE_INTEGER // 9007199254740991
此時用到 json-bigint將后端返回數(shù)據(jù)處理處理之后才能正常使用:
- 1.項目需要安裝的依賴
> npm i json-bigint
- 2.引入json-bigint文件
>import JSONbig from 'json-bigint'
transformResponse是將后端返回的原始數(shù)據(jù)進(jìn)行處理
下面使用 : try-catch 來捕獲異常
因為:后端返回的數(shù)據(jù)可能不是 JSON 格式字符串,如果不是則將data數(shù)據(jù)原封不動的直接返回給請求使用
const request = axios.create({
baseURL: '', // 請求的基礎(chǔ)路徑
transformResponse: [function (data) {
try {
return JSONbig.parse(data)
} catch (err) {
return data
}
}]
})請求回來的數(shù)據(jù)使用.toString() 即可獲取
request({
method:'GET',//請求方法
url:'',//請求路徑
params: {},//請求參數(shù)拼接在url上面
}).then(res=>{
console.log(res.data.id.toString())
})JS實現(xiàn)超范圍的數(shù)相加
在js中能表示的最大安全整數(shù)是 9007199254740991,可以用API Number.MAX_SAFE_INTEGER 看一下

超出范圍就會發(fā)生精度丟失,像這樣

解決方法
相當(dāng)于一個字符串相加的問題。不能把數(shù)字簡單的相加,需要倒序取數(shù)字的每一位,進(jìn)行相加,大于等于10,進(jìn)1,小于10,進(jìn)0,把結(jié)果保存在一個字符串中。
注意點(diǎn):
- 1、要考慮長度不一樣
- 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方法返回數(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ù),長度不一樣的時候,其中一個數(shù) 已經(jīng) pop 了所有數(shù)組中的元素之后,還要pop的話,就會返回 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)位值的時候,用的并不是 1 和 0 ,而是true 和 false,這是因為隱式類型轉(zhuǎn)換的時候,true會轉(zhuǎn)為1,false會轉(zhuǎn)為0。

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
layui-table表復(fù)選框勾選的所有行數(shù)據(jù)獲取的例子
今天小編就為大家分享一篇layui-table表復(fù)選框勾選的所有行數(shù)據(jù)獲取的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JS中使用TextDecoder解碼二進(jìn)制數(shù)據(jù)(數(shù)據(jù)流的逐步解碼)
JS中使用TextDecoder將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為可讀文本字符串,首先,創(chuàng)建TextDecoder對象,使用decode()方法,解碼為字符串,,{stream:true}選項允許處理流式數(shù)據(jù),適用于大型數(shù)據(jù)流的逐步解碼,TextDecoder廣泛應(yīng)用于WebSocket通信、文件讀取、網(wǎng)絡(luò)響應(yīng)等場景2024-10-10
TypeScript中定義變量方式以及數(shù)據(jù)類型詳解
TypeScript支持 JavaScript的所有語法和語義,同時通過作為ECMAScript的超集來提供一些額外的功能,如類型檢測和更豐富的語法,這篇文章主要給大家介紹了關(guān)于TypeScript中定義變量方式以及數(shù)據(jù)類型詳解的相關(guān)資料,需要的朋友可以參考下2022-08-08

