有个问题需要将字符串(大数字)计算相加并转换成字符串,传递的参数是字符串。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有个问题需要将字符串(大数字)计算相加并转换成字符串,传递的参数是字符串。相关的知识,希望对你有一定的参考价值。

JS 的数字计算坑比较多的,浮点型的计算带有精度问题,所以通常先将浮点型变成整数进行计算,然后再以字符串的形式,变成浮点型输出。

大数字计算会变成科学计数法,JS 中,数字超过21位就会变成科学计数法,例如:8100824045303269669937 -> 8.100824045303269e+21 ,这样会损失一些精度。

 

分析了一下排名第一的代码:

String.prototype.reverse = function() {
  return this.split(‘‘).reverse().join(‘‘);
}
 
function sumStrings(a,b) {
  a = a.reverse(); b = b.reverse();
  var carry = 0; //进位
  var index = 0; //位数
  var sumDigits = []; //结果
 
  while (index < a.length || index < b.length || carry != 0) {
    var aDigit = index < a.length ? parseInt(a[index]) : 0;
    var bDigit = index < b.length ? parseInt(b[index]) : 0;
    var digitSum = aDigit + bDigit + carry;
 
    sumDigits.push((digitSum % 10).toString());
    carry = Math.floor(digitSum / 10);
    index++;
  }
 
  sumDigits.reverse();
  while (sumDigits[0] == ‘0‘)  sumDigits.shift();
 
  return sumDigits.join(‘‘);
}
 
大体思路比较巧妙,先把数字倒过来然后按位计算,while 循环的条件用的很神。设置三个变量分别作为位数(index)、进位(carry)、结果(sumDigits),每次循环用 index 拿到对应位的数字加上上一个循环的进位,然后取10的余数以字符串形式存入结果数字,然后再取到本次运算的进位,下一个循环继续。最后处理输出即可。

以上是关于有个问题需要将字符串(大数字)计算相加并转换成字符串,传递的参数是字符串。的主要内容,如果未能解决你的问题,请参考以下文章

js实现字符串切割并转换成对象格式保存到本地

Ptyhon :生成一个1到50的大字符串,每个数字之间有个空格 1 2 3 4 ..........50

团队-科学计算器-需求分析

《团队-科学计算器-需求分析》

rabbitmq 消费 json 消息并转换成 Java 对象

43. Multiply Strings