← 返回博客列表

JS科学计数法转数值

Vic.Wang2016/05/123218 阅读0 喜欢最近更新 2026/07/07 15:35:50

本文写于 2016 年,距今已有 10 年,文中提及的技术方案与接口可能已经过时,请注意甄别参考。

好久没踩到坑了,今天又踩到了。

之前的一个金额格式化的自定义函数,发现了个异常,输入 0.0000006 的时候,提交没问题,列表取过来用函数处理后的结果为空,一看数据,接口返回的是 6e-7,这是科学计数法的表示方法,瞬间抓狂了。虽说科学计数法表示的数在 JavaScript 中也是数值,可和我那个自定义的金额格式化函数并不兼容,查了下资料没找到 JS 提供什么方法把科学计数法转换为数值的,那就自己写个吧。

深入了解下,发现正数在大于 22 位的时候会变成科学计数法,而负数在小数点后 7 位的时候会变成科学计数法表示。

既然知道了那就好办了,因为正数是大于 22 位才出现,平时根本就用不到这个位数,而且正数小于 22 位的科学计数法,可自动转换数值,所以正数可以不处理,负数的不识别,只能手动处理

/*科学计数法转换数值*/
function scientificToNumber(num) {
    var str = num.toString();
    var reg = /^(\d+)(e)([\-]?\d+)$/;
    var arr, len, zero = '';

    /*6e7或6e+7 都会自动转换数值*/
    if (!reg.test(str)) {
        return num;
    } else {
        /*6e-7 需要手动转换*/
        arr = reg.exec(str);
        len = Math.abs(arr[3]) - 1;
        for (var i = 0; i < len; i++) {
            zero += '0';
        }

        return '0.' + zero + arr[1];
    }
}

上面代码中,正则只匹配科学计数法为负的情况,上面说了正数是不用处理的,然后根据位数补下0。

还发现了 parseFloat 函数的一些问题,大于 10 位小数部分就舍弃了;当 18 位的时候,18 位会变为 0;当大于 18 位的时候,18 位之后的都为 0,16 位会进 1。

若有共鸣,不妨点个喜欢

本文地址:https://www.mingsixue.com/blog/detail/JS-scientific-notation-number

分享:微博QQ空间X