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, 使用按位相加,逐位处理,可以直接搜索相关关键词,自有各路大神的骚操作;但是目前不会接触到那么大的数据,如果一定要进行处理还是在后端处理比较好。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值