TypeScript中处理大数字(会丢失后面部分数字)
為啥要弄這玩意?
最近做數值游戲,需要用到很大的數字,在前端大數字會自動變成e的科學計數法。
例如123456789123456789123456789保存到localStorage時,會變成1.2345678912345679e+26
有啥問題?
問題:
1. 在傳遞給服務端時,服務端因為不能處理大數字(怎么就處理不了?!),就想要我傳字符串給他,
但是大數字會變成科學計數法的字符串"4e+23"之類給服務端,而不是"400000000000000..."理想的數字字符串。
2. 在保存本地localStorage時,因為key-value的值只能是字符串,所以把num.toString()后也會變成科學計數法保存。
例如123456789123456789123456789保存到localStorage時,會變成1.2345678912345679e+26
3. 嘗試去github、csdn找BigDecimal之類的處理大數字的Javascript或Typescript版本,但是用不了。
在常規H5里還好, 但是放到微信小游戲里就不行,會Decimal is not defined之類, 增加了window和修改wx.config配置文件也不行。急死個人哎。
解決方案:
1. 因為調試第三方庫死活調不通,反正數值游戲在大數值以后,小數就非常微乎其微了,損失一些小數字也無所謂。而且項目急著上線,臥槽加班到很晚。
2. 于是寫了下面的一個很搓的方法。判斷e的數量,來手動給數字字符串+"0" = =!
一個很搓的轉換函數
/**
* 將數字轉成字符串,可以轉換超過16位的大數字,但是會丟失精度
* @param value 數字
*/
public getNumberToString(value: number) {
let str = value.toString();
//大于16位,用e表示的大數字,需要轉換
if (str.indexOf("e") != -1) {
//e位置
let eIndex = str.indexOf("e");
//小數點位置
let pIndex = str.indexOf(".");
//是否有小數點, 400000000...這樣的數是沒有小數點的
let bHavePoint = pIndex;
//小數點位置
pIndex = (pIndex == -1) ? 0 : pIndex;
//小數點后的數字位數
let small = eIndex - pIndex - 1;
//e前面的數字
let result = str.substr(0, eIndex);
//如果e前面數字有小數點,則去掉小數點
if (bHavePoint != -1) {
result = result.replace(".", "");
}
//e后面的數字
let eNum = str.substr(eIndex + 2, str.length);
//需要添加的0數量
let len = parseInt(eNum) - small;
for (let i = 0; i < len; i++) {
result += "0";
}
//返回最終結果
return result;
}else{
//不是大數字,則直接返回
return value.toString();
}
}
實際應用
protected createGameScene(): void {
//小型數字,正確返回
let a: number = 3000000;
console.log(a.toString()); //3000000
console.log(this.getNumberToString(a)); //3000000
//大數字,后面數字有損
let b:number = 123456789123456789123456789;
console.log(b.toString()); //1.2345678912345679e+26
console.log(this.getNumberToString(b)); //123456789123456790000000000
//大數字,無小數點,正確返回
let c:number = 90000000000000000000000000000;
console.log(c.toString()); //9e+28
console.log(this.getNumberToString(c)); //90000000000000000000000000000
//大數字字符串 parseInt還原成 數字
let d:number = parseInt(this.getNumberToString(c));
console.log(d); //9e+28
//大數字字符串 parseFloat還原成 數字
let e:number = parseFloat(this.getNumberToString(c));
console.log(e); //9e+28
//科學計數法字符串 parseInt還原成數字 這里不能使用parseInt來還原科學計數法的字符串,會錯誤
let f:number = parseInt(c.toString());
console.log(f); //9
//科學計數法字符串 parseFloat還原成數字 正確
let g:number = parseFloat(c.toString());
console.log(g); //9e+28
}
總結
以上是生活随笔為你收集整理的TypeScript中处理大数字(会丢失后面部分数字)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么在Python3.7中使用pyodb
- 下一篇: mysql高效sql语句_高效SQL优化