最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決超出JS的安全整數(shù)的限制范圍問題

 更新時(shí)間:2024年08月30日 14:52:14   作者:攻^城^獅  
這篇文章主要介紹了解決超出JS的安全整數(shù)的限制范圍問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

解決超出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ù)原封不動的直接返回給請求使用

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實(shí)現(xiàn)超范圍的數(shù)相加

在js中能表示的最大安全整數(shù)是 9007199254740991,可以用API Number.MAX_SAFE_INTEGER 看一下

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

解決方法

相當(dāng)于一個(gè)字符串相加的問題。不能把數(shù)字簡單的相加,需要倒序取數(shù)字的每一位,進(jìn)行相加,大于等于10,進(jìn)1,小于10,進(jìn)0,把結(jié)果保存在一個(gè)字符串中。

注意點(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方法返回?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ù),長度不一樣的時(shí)候,其中一個(gè)數(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)位值的時(shí)候,用的并不是 1 和 0 ,而是true 和 false,這是因?yàn)殡[式類型轉(zhuǎn)換的時(shí)候,true會轉(zhuǎn)為1,false會轉(zhuǎn)為0。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

双流县| 华坪县| 仙居县| 康马县| 肇庆市| 定州市| 林周县| 浦东新区| 肥乡县| 东阿县| 杭州市| 定结县| 鄄城县| 揭东县| 祁门县| 新化县| 宁河县| 定远县| 夏邑县| 康定县| 和林格尔县| 天镇县| 苏尼特左旗| 鲁山县| 彭山县| 县级市| 伊宁市| 德安县| 滕州市| 庆元县| 抚松县| 五原县| 新竹县| 辽宁省| 湘西| 颍上县| 开化县| 灵璧县| 时尚| 嘉黎县| 铜鼓县|