编程语言
首页 > 编程语言> > Javascript 的浮点计算精度问题和数字转科学计数法问题

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