将字符串求和为数字

时间:2018-11-09 14:30:47

标签: javascript

我正在尝试解决在代码战中看起来很简单的kata,但我似乎做得不好。

有关此操作的说明如下所示

给出两个整数的字符串表示形式,返回这些整数之和的字符串表示形式。

例如:

sumStrings('1','2') // => '3'

一个整数字符串表示形式,除了十个数字“ 0”至“ 9”之外,将不包含任何字符。

这就是我尝试过的

function sumStrings(a,b) { 
  return ((+a) + (+b)).toString();
}

但是结果解决了除两个以外的所有问题,这是我得到的错误

  

sumStrings('712569312664357328695151392','8100824045303269669937')-预期:'712577413488402631964821329',而不是:'7.125774134884027e + 26'

     

sumStrings('50095301248058391139327916261','81055900096023504197206408605')-预期:'131151201344081895336534324866',而不是:'1.3115120134408189e + 29'

我似乎不明白问题的根源。任何帮助都会帮助您。

3 个答案:

答案 0 :(得分:2)

您输入的值大于int类型的最大值。您可以尝试将代码更改为:

 function sumStrings(a,b) { 
  return ((BigInt(a)) + BigInt(b)).toString();
}

这样,它应该返回正确的值

答案 1 :(得分:1)

您可以弹出数字并随身携带一个下一个数字。

function add(a, b) {
    var aa = Array.from(a, Number),
        bb = Array.from(b, Number),
        result = [],
        carry = 0,
        i = Math.max(a.length, b.length);
        
    while (i--) {
        carry += (aa.pop() || 0) + (bb.pop() || 0);
        result.unshift(carry % 10);
        carry = Math.floor(carry / 10);
    }
    while (carry) {
        result.unshift(carry % 10);
        carry = Math.floor(carry / 10);
    }
    return result.join('');
}

console.log(add('712569312664357328695151392', '8100824045303269669937'));
console.log(add('50095301248058391139327916261', '81055900096023504197206408605'));

答案 2 :(得分:0)

问题在于常规的javascript整数没有足够的空间来存储那么大的数字,因此它使用指数表示法来保持精度

您可以做的是将每个数字分成几部分,然后分别添加

这里是一个这样的示例SO answer