JS科学计数法初探

一、背景简介
近来接手一个金融相关项目,涉及到大数据的计算,页面上出现科学计数法问题,从而引发的探索。

二、科学计数法简介
关于科学计数法详细介绍请自行百度,这里只介绍结构
eg. 6.23E26 (E不区分大小写)
其中 6.23 为小数位部分 ,E为科学计数法声明,26指10的幂指数。

三、JS中科学计数法探索

1、JS中科学计数法出现的时机
    JavaScript在以下情景会自动将数值转换为科学计数法:
    1)小数点前的数字多于21位。
    2)小数点后的零多于5个。

2、解决办法
    因大多数情况下,需要我们向用户所展示的完整数据并不能出现科学计数法,关于科学计数法转换,网上有许多解决办法,然而在我的项目中,并不能解决所有的问题。
    科学计数法的表示大多有以下两种:
    eg. 6.78E27  6.78E+27

1)对于第一种(6.78E27)
这种比较容易解决,在项目中,我基本使用

parseFloat("6.78E27").toString();

即可解决问题

2)对于第二种(6.78E+27)
对于带符号的科学计数法,博主寻遍网络没有找到什么特别满意的方法,于是自己写了一个方法

function convertNum(amount) {
            // 判断是否科学计数法,是则进行转换
            var num = 0;
            if((amount.indexOf('E') != -1) || (amount.indexOf('e') != -1)) {
                (amount.indexOf('E') != -1)? num = amount.indexOf('E'):num = amount.indexOf('e');
                var decimal = amount.substr(0, num);
                // devide the sentice efficial number
                var decArr = decimal.split('.',2);
                // 10的指数部分
                var power = amount.substr(num+1,amount.length);
                // symbol + -
                var symbol = power.substr(0,1);
                power = power.substr(1, power.length);
                power = power * 1.0;
                if('+' == symbol) {
                    // 0 的数量是 power - decArr[1]
                    power = power - decArr[1].length;
                    // the return data
                    var result = [];
                    while(power > 0) {
                        result.unshift(0);
                        power -= 1;
                    }
                    result.unshift(decArr[1] * 1.0);
                    result.unshift(decArr[0] * 1.0);
                    result.join("");
                    result = result + '';
                    amount = result.replace(/,/g,'');
                }
            }
            return amount;
        }
    *该方法只是一个初稿,适合金融项目,思考过后完善了一下方法(请原谅无厘头的注释..)
function convertNum(amount) {
                // 判断是否科学计数法,是则进行转换
                var num = 0;
                var result = [];
                amount = new String(amount);
                if((amount.indexOf('E') != -1) || (amount.indexOf('e') != -1)) {
                    (amount.indexOf('E') != -1)? num = amount.indexOf('E'):num = amount.indexOf('e');
                    var decimal = amount.substr(0, num);
                    // devide the sentice efficial number
                    var decArr = decimal.split('.',2);
                    // total 10 power
                    var power = amount.substr(num+1,amount.length);
                    // symbol + -
                    var symbol = power.substr(0,1);
                    power = power.substr(1, power.length);
                    power = power * 1.0;
                    if('+' == symbol) {
                        // the number of 0 is power - decArr[1]
                        power = power - decArr[1].length;
                        // the return data
                        while(power > 0) {
                            result.unshift(0);
                            power -= 1;
                        }
                        result.unshift(decArr[1] * 1.0);
                        result.unshift(decArr[0] * 1.0);
                    } else {
                        power = power - decArr[1].length;
                        var result = [0];
                        result.push('.');
                        while(power > 0) {
                            result.push(0);
                            power -= 1;
                        }
                        result.push(decArr);
                    }
                }
                result.join("");
                result = result + '';
                amount = result.replace(/,/g,'');
                return amount;
            }

四、总结
代码只是单纯的按照业务逻辑进行罗列的,有可改进的地方,欢迎大家提示,本人还是个菜,只是想总结一下遇到的问题。特别想把循环去掉,但一直没有找到办法,希望大家可以给出意见。

你可能感兴趣的:(JavaScript)