日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

TypeScript中处理大数字(会丢失后面部分数字)

發(fā)布時(shí)間:2023/12/15 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 TypeScript中处理大数字(会丢失后面部分数字) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為啥要弄這玩意?

最近做數(shù)值游戲,需要用到很大的數(shù)字,在前端大數(shù)字會(huì)自動(dòng)變成e的科學(xué)計(jì)數(shù)法。

例如123456789123456789123456789保存到localStorage時(shí),會(huì)變成1.2345678912345679e+26

有啥問題?

問題:

1. 在傳遞給服務(wù)端時(shí),服務(wù)端因?yàn)椴荒芴幚泶髷?shù)字(怎么就處理不了?!),就想要我傳字符串給他,

但是大數(shù)字會(huì)變成科學(xué)計(jì)數(shù)法的字符串"4e+23"之類給服務(wù)端,而不是"400000000000000..."理想的數(shù)字字符串。

2. 在保存本地localStorage時(shí),因?yàn)閗ey-value的值只能是字符串,所以把num.toString()后也會(huì)變成科學(xué)計(jì)數(shù)法保存。

例如123456789123456789123456789保存到localStorage時(shí),會(huì)變成1.2345678912345679e+26

3. 嘗試去github、csdn找BigDecimal之類的處理大數(shù)字的Javascript或Typescript版本,但是用不了。

在常規(guī)H5里還好, 但是放到微信小游戲里就不行,會(huì)Decimal is not defined之類, 增加了window和修改wx.config配置文件也不行。急死個(gè)人哎。

解決方案:

1. 因?yàn)檎{(diào)試第三方庫(kù)死活調(diào)不通,反正數(shù)值游戲在大數(shù)值以后,小數(shù)就非常微乎其微了,損失一些小數(shù)字也無所謂。而且項(xiàng)目急著上線,臥槽加班到很晚。

2. 于是寫了下面的一個(gè)很搓的方法。判斷e的數(shù)量,來手動(dòng)給數(shù)字字符串+"0" = =!

一個(gè)很搓的轉(zhuǎn)換函數(shù)

    /**
     * 將數(shù)字轉(zhuǎn)成字符串,可以轉(zhuǎn)換超過16位的大數(shù)字,但是會(huì)丟失精度
     * @param value 數(shù)字
     */
    public getNumberToString(value: number) {
        let str = value.toString();
        //大于16位,用e表示的大數(shù)字,需要轉(zhuǎn)換
        if (str.indexOf("e") != -1) {
            //e位置
            let eIndex = str.indexOf("e");
            //小數(shù)點(diǎn)位置
            let pIndex = str.indexOf(".");
            //是否有小數(shù)點(diǎn), 400000000...這樣的數(shù)是沒有小數(shù)點(diǎn)的
            let bHavePoint = pIndex;
            //小數(shù)點(diǎn)位置
            pIndex = (pIndex == -1) ? 0 : pIndex;
            //小數(shù)點(diǎn)后的數(shù)字位數(shù)
            let small = eIndex - pIndex - 1;
            //e前面的數(shù)字
            let result = str.substr(0, eIndex);
            //如果e前面數(shù)字有小數(shù)點(diǎn),則去掉小數(shù)點(diǎn)
            if (bHavePoint != -1) {
                result = result.replace(".", "");
            }
            //e后面的數(shù)字
            let eNum = str.substr(eIndex + 2, str.length);
            //需要添加的0數(shù)量
            let len = parseInt(eNum) - small;
            for (let i = 0; i < len; i++) {
                result += "0";
            }
            //返回最終結(jié)果
            return result;
        }else{
            //不是大數(shù)字,則直接返回
            return value.toString();
        }

    }

  

實(shí)際應(yīng)用

  protected createGameScene(): void {
        //小型數(shù)字,正確返回
        let a: number = 3000000;
        console.log(a.toString());               //3000000
        console.log(this.getNumberToString(a));  //3000000

        //大數(shù)字,后面數(shù)字有損
        let b:number = 123456789123456789123456789;   
        console.log(b.toString());               //1.2345678912345679e+26
        console.log(this.getNumberToString(b));  //123456789123456790000000000

        //大數(shù)字,無小數(shù)點(diǎn),正確返回
        let c:number = 90000000000000000000000000000; 
        console.log(c.toString());               //9e+28
        console.log(this.getNumberToString(c));  //90000000000000000000000000000
        
        //大數(shù)字字符串 parseInt還原成 數(shù)字
        let d:number = parseInt(this.getNumberToString(c));
        console.log(d);  //9e+28

        //大數(shù)字字符串 parseFloat還原成 數(shù)字
        let e:number = parseFloat(this.getNumberToString(c));
        console.log(e);  //9e+28

        //科學(xué)計(jì)數(shù)法字符串  parseInt還原成數(shù)字  這里不能使用parseInt來還原科學(xué)計(jì)數(shù)法的字符串,會(huì)錯(cuò)誤
        let f:number = parseInt(c.toString());
        console.log(f);  //9     

        //科學(xué)計(jì)數(shù)法字符串 parseFloat還原成數(shù)字 正確
        let g:number = parseFloat(c.toString());
        console.log(g);  //9e+28
    }

  

總結(jié)

以上是生活随笔為你收集整理的TypeScript中处理大数字(会丢失后面部分数字)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。