Web 前端开发

用js转换科学计数法为数字

2018-01-07  本文已影响1814人  厂厂哥

前言

今天有个需求,是把两个只包含数字的字符串的数字相加结果以字符串形式导出。原本以为很简单,结果发现数字过大时会自动准换为科学计数法表达,而且精度不高,为此专门去百度了下(vpn挂了,谷歌不了),结果发现百度的答案没有什么可行性,最后自己写了下。

思路

emmmm,因为过大的数字会直接转换为科学技术法表示,所以不能用过大数字相加,就想分解数来按小学老师教的那样用数位来加,结果发现切实可行,精度挺高。

代码部分

function sumStrings(a, b) {//输入的a,b都是只包含数字的字符串
    var output;
    output = a * 1 + b * 1;//转换为数字
    if (output.toString().indexOf("+") == -1) {//判断不为科学计数法输出
        output = output.toString();
    } else {//判断为科学输入法输出
        a = a.split("");//字符串分割数组
        b = b.split("");//字符串分割数组
        if (a.length > b.length) {
            output = test(a, b);
        } else {
            output = test(b, a);
        }
    }
    return output;
}
//把科学计数法准换为数字
function test(a, b) {//要求a的长度比b的长度大
    var i, arr = [],
        j = 0;
    for (i = 0; i < a.length; i++) {
        if (i < b.length) {//在共有的位进行操作
            var c = a[a.length - i - 1] * 1 + b[b.length - i - 1] * 1;//取得同位相加数
            if (c < 10) {//判断同位相加数小于10
                if (j + c === 10) {//判断位数加进位数为10
                    arr.unshift(0);//位数为0
                    j = 1;//重置进位为1
                } else {//判断位数加进位数不为10
                    arr.unshift(j + c);//位数为进位加同位相加数
                    j = 0;//重置进位为0
                }
            } else {//判断同位相加数大于等于10
                arr.unshift(c + j - 10);//位数为c+j-10
                j = 1;//重置进位为1
            }
        } else {//非共有的位操作
            var c = a[a.length - i - 1] * 1;//取得位
            if (j === 1) {//进位判断
                if ((j + c) === 10) {//判断位数加进位数为10
                    arr.unshift(0);//位数为0
                    j = 1;//重置进位为1
                } else {//判断位数加进位数不为10
                    arr.unshift(j + c);//位数为进位加同位相加数
                    j = 0;//重置进位为0
                }
            } else {
                arr.unshift(c);//进位为0,直接放入
            }
        }
    }
    if (j === 1) { arr.unshift(1) }//最后判断若a和b同长度,且首位相机大于等于0是,数组添加一位1
    return arr.join("");//最后字符串形式输出
}

后记

写的还是有点马虎,思路大体就是这样了,有空再重写封装好一点吧。

上一篇下一篇

猜你喜欢

热点阅读