解決超出JS的安全整數(shù)的限制范圍問題
解決超出JS的安全整數(shù)的限制范圍
JavaScript 能夠準確表示的整數(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ù)進行處理
下面使用 : try-catch 來捕獲異常
因為:后端返回的數(shù)據(jù)可能不是 JSON 格式字符串,如果不是則將data數(shù)據(jù)原封不動的直接返回給請求使用
const request = axios.create({ baseURL: '', // 請求的基礎路徑 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ā)生精度丟失,像這樣
解決方法
相當于一個字符串相加的問題。不能把數(shù)字簡單的相加,需要倒序取數(shù)字的每一位,進行相加,大于等于10,進1,小于10,進0,把結果保存在一個字符串中。
注意點:
- 1、要考慮長度不一樣
- 2、要考慮進位,所以需要倒序來相加
代碼如下:
function add(a,b){ // 保存最終結果 var res=''; // 保存兩位相加的結果 和 進位值 var c=0; // 字符串轉數(shù)組 a = a.split(''); b = b.split(''); while (a.length || b.length || c){ // ~~ 用來把String類型 轉為 Number類型 // 把兩位相加的結果 和 進位值相加 // pop方法返回數(shù)組的最后一位,并刪除 c += ~~a.pop() + ~~b.pop(); // 取余,把余數(shù)拼接到最終結果中 res = c % 10 + res; // 保存進位,true 或者 false c = c>9; } return res; } add('11111111111111111','22222222222222222');
解釋:
1、~
是JavaScript中的操作符,按位非
~~
經(jīng)常用來進行取整和類型轉換,他和顯示的用Number進行類型轉換還是有區(qū)別的,比如處理 undefined
的時候。
而在兩個大整數(shù),長度不一樣的時候,其中一個數(shù) 已經(jīng) pop 了所有數(shù)組中的元素之后,還要pop的話,就會返回 undefined
,所以如果用 Number 顯示的轉化,起碼要寫成這樣。
var ai = a.pop(); ai = ai===undefined? 0:Number(ai); var bi = b.pop(); bi = bi===undefined? 0:Number(bi); c += ai + bi;
明顯是用 ~~
方便。
2、在保存進位值的時候,用的并不是 1 和 0 ,而是true 和 false,這是因為隱式類型轉換的時候,true會轉為1,false會轉為0。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
layui-table表復選框勾選的所有行數(shù)據(jù)獲取的例子
今天小編就為大家分享一篇layui-table表復選框勾選的所有行數(shù)據(jù)獲取的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS中使用TextDecoder解碼二進制數(shù)據(jù)(數(shù)據(jù)流的逐步解碼)
JS中使用TextDecoder將二進制數(shù)據(jù)轉換為可讀文本字符串,首先,創(chuàng)建TextDecoder對象,使用decode()方法,解碼為字符串,,{stream:true}選項允許處理流式數(shù)據(jù),適用于大型數(shù)據(jù)流的逐步解碼,TextDecoder廣泛應用于WebSocket通信、文件讀取、網(wǎng)絡響應等場景2024-10-10TypeScript中定義變量方式以及數(shù)據(jù)類型詳解
TypeScript支持 JavaScript的所有語法和語義,同時通過作為ECMAScript的超集來提供一些額外的功能,如類型檢測和更豐富的語法,這篇文章主要給大家介紹了關于TypeScript中定義變量方式以及數(shù)據(jù)類型詳解的相關資料,需要的朋友可以參考下2022-08-08