Javascript 的浮点计算精度问题和数字转科学计数法问题
作者:互联网
Javascript 在以下情景下会自动将数值转换为科学计数法:
1、当整数的位数超过22位时,js会自动将整数数值转化为科学记数法。
js中的科学记数法:10000000000000000000(21个0)在js中的科学记数法表示为:1e+21;
2、小数点前边是0,小数点后十分位(包含十分位)之后的0的个数超过6个数值就会自动转化为科学计数法;
0.0000004 会转换为: 4e-7, 而0.10000004 则不会被转换,1.000000004也不会被转换
为了避免这种自动转换,编写一个函数利用正则来将科学计数法的数值转换为数值显示:
function scientificToNumber (num) {
if(/\d+\.?\d*e[\+\-]*\d+/i.test(num)) {
let zero = '0';
let parts = String(num).toLowerCase().split('e');
let e = parts[1];
let zeroLen = Math.abs(e);
let sign = e / zeroLen;
let beforeArr = parts[0].split('.');
if(sign < 0) {
num = zero + '.' + new Array(zeroLen).join(zero) + beforeArr.join('');
} else {
let dec = beforeArr[1];
if(dec) {
zeroLen = zeroLen - dec.length;
num = beforeArr.join('') + new Array(zeroLen + 1).join(zero);
}
}
}
return num;
}
console.log(scientificToNumber(4e-7));
这个函数在第二种情况下是可以有效转换的,但是第一种情况下数值过长有时候不生效; 为解决那个codewars问题: Sum Strings As Numbers, 使用按位相加,逐位处理,可以直接搜索相关关键词,自有各路大神的骚操作;但是目前不会接触到那么大的数据,如果一定要进行处理还是在后端处理比较好。
标签:zeroLen,join,Javascript,计数法,zero,num,let,计算精度 来源: https://blog.csdn.net/Jackshijin/article/details/110670521