Home / Blog / it

JS科学计数法转数值

Author: Vic.Wang 2016/05/12 Tags:科学计数法科学计数法转换数值scientificnotationnumber

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

之前的一个金额格式化的自定义函数,发现了个异常,输入 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。