TypeScript中处理大数字(会丢失后面部分数字)
為啥要弄這玩意?
最近做數(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么在Python3.7中使用pyodb
- 下一篇: mysql高效sql语句_高效SQL优化