前言
今天有个需求,是把两个只包含数字的字符串的数字相加结果以字符串形式导出。原本以为很简单,结果发现数字过大时会自动准换为科学计数法表达,而且精度不高,为此专门去百度了下(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("");//最后字符串形式输出
}
后记
写的还是有点马虎,思路大体就是这样了,有空再重写封装好一点吧。
网友评论