8

I have two text boxes. Each will take input up to thousand digits.

Now i want to add these two numbers. My question is what data type should i use to store the result?

I have tried this:

<script>
   var x = 'Thousand digit of number'
    var y = 'Thousand digit of number'
    var z = x + y
</script>

but i am getting result in exponential form. How to store the result and display it?

Swapnil Patil
  • 912
  • 1
  • 7
  • 14

9 Answers9

13

Yet another solution, because it's faster and cleaner.

function add(A, B) {
  const AL = A.length
  const BL = B.length
  const ML = Math.max(AL, BL)

  let carry = 0, sum = ''

  for (let i = 1; i <= ML; i++) {
    let a = +A.charAt(AL - i)
    let b = +B.charAt(BL - i)

    let t = carry + a + b
    carry = t/10 |0
    t %= 10

    sum = (i === ML && carry)
      ? carry*10 + t + sum
      : t + sum
  }

  return sum
}

> add(
'9999999999999999999999999999999999999999999999999999999999999999999999999999',
'999999999999999999999999999999999999999'
)

> "10000000000000000000000000000000000000999999999999999999999999999999999999998"
Qwerty
  • 29,062
  • 22
  • 108
  • 136
7

Use BigInt as described here: https://stackoverflow.com/a/56370672/641913

const z = BigInt(x) + BigInt(y);

console.log(z.toString());
Liam
  • 143
  • 2
  • 7
2

Here is another solution not so different from others you can find in the internet (consider that it doesn't work with negative numbers!):

function sums(arg1, arg2) {
 var sum = "";
 var r = 0;
 var a1, a2, i;

 // Pick the shortest string as first parameter and the longest as second parameter in my algorithm
 if (arg1.length < arg2.length) {
  a1 = arg1;
  a2 = arg2;
 }
 else {
  a1 = arg2;
  a2 = arg1;
 }
 a1 = a1.split("").reverse();
 a2 = a2.split("").reverse();

 // Sum a1 and a2 digits
 for (i = 0; i < a2.length; i++) {
  var t = ((i < a1.length) ? parseInt(a1[i]) : 0) + parseInt(a2[i]) + r;
  
  sum += t % 10;

  r = t < 10 ? 0 : Math.floor(t / 10);
 }
 // Append the last remain
 if (r > 0)
  sum += r;

 sum = sum.split("").reverse();
 
 // Trim the leading "0"
 while (sum[0] == "0")
  sum.shift();

 return sum.length > 0 ? sum.join("") : "0";
}

// Test
function testEquals(expected, actual) {
 if (expected == actual)
  console.log("OK: " + expected);
 else
  console.error("ERROR: " + expected + " != " + actual);
}

testEquals("100", sums("99", "1"));
testEquals("100", sums("00099", "0001"));
testEquals("10000000000", sums("9999999999", "1"));
testEquals("10000010101", sums("9999999999", "10102"));
testEquals("0", sums("0", "0"));
testEquals("1", sums("0", "1"));
testEquals("9", sums("8", "1"));
testEquals("9", sums("1", "8"));
testEquals("10000000000000000000000000000000000000000", sums("9999999999999999999999999999999999999999", "1"));
Nicolai Nita
  • 173
  • 9
1

Input the numbers as string and add each characters each other as array something like this:

 function add() {
        document.getElementById("demo").innerHTML = "";
        var x = document.getElementById("txt1").value;
        var y = document.getElementById("txt2").value;
        var len;
        var lenx = x.length;
        var leny = y.length;
        var x1,y1,rem,div=0;
        if(lenx>leny) len = lenx; else len = leny;

        for(var i=0;i<len;i++){
            if(i>=lenx) x1  = 0;
            else x1 = parseInt(x[lenx-i-1]);
            if(i>=leny) y1 = 0;
            else y1 = parseInt(y[leny-i-1]);
            rem = (x1+y1+div)%10;
            div = Math.floor((x1 + y1+div)/10);
            document.getElementById("demo").innerHTML = rem + document.getElementById("demo").innerHTML;
        }
       if(div>0){
            document.getElementById("demo").innerHTML = div + document.getElementById("demo").innerHTML;
       }
    }

Here the code: https://jsfiddle.net/mtsL1k2x/5/

Note: this is only for natural numbers. You can modify depending on your inputs

mudin
  • 2,672
  • 2
  • 17
  • 45
0

Either use a big number library like https://mathjs.org/docs/datatypes/bignumbers.html , or you can use something lighter weight (but easy to understand) like http://www.discoversdk.com/knowledge-base/arbitrary-length-integer-addition-in-javascript

ephraim
  • 21
  • 2
0

Well, if you want to do this without using BigInt or any third-party Library, then I don't think you need to convert to an array, you can use the charAt() function to add the individual characters at each point in the string. You would have to use the for loop starting from its maximum value and reducing till its lowest. The code snippet is below;

function add(a, b) {
let sum='';
 let z,x;
 let r=0;
 if (a.length>=b.length){
   z=a;
   x=b;
 }
 else{
   z=b;
   x=a;
 };
 let p=x.length;
 for (let i=z.length;i>0;i--){
   let t=((p>0)?parseInt(x.charAt(p-1)):0)+parseInt(z.charAt(i-1))+r;
   sum=(t%10)+sum;
   r=t<10?0:Math.floor(t/10);
   p=p-1;
 };
 if (r>0){sum=r+sum};
 return sum;

};
0
function add(a, b) {
    a = a.split("").reverse();
    b = b.split("").reverse();
    let maxLen=Math.max(a.length, b.length);
    let sum = [];
    let remainder = 0;
    for (let i = 0; i < maxLen; i++) {
      let x = parseInt(a[i]) ? parseInt(a[i]) : 0;
      let y = parseInt(b[i]) ? parseInt(b[i]) : 0;
      let digit = (x + y + remainder) % 10;
      remainder = Math.floor((x + y + remainder) / 10);
      sum.unshift(digit);
    }
    if (remainder) {sum.unshift(remainder)}
    
    return sum.join("");
  }
Riaz Bappy
  • 23
  • 5
-2
function add(x, y) {
    //this function adds two extremely large numbers, negative and/or positive
    var temp, borrow=false, bothNeg=false, oneNeg=false, neg=false;
    if (x < 0 && y < 0) { bothNeg = true; x = -x; y = -y; } 
    else if (x < 0 || y < 0) {
        oneNeg = true;
        if (Math.abs(x) == Math.abs(y)) { x = 0; y = 0; }
        else if (x < 0 && Math.abs(x) > Math.abs(y)) { neg = true; x = -x; y = -y; }
        else if (x < 0 && Math.abs(x) < Math.abs(y)) { temp = y; y = x; x = temp; }
        else if (y < 0 && Math.abs(x) < Math.abs(y)) { neg = true; temp = y; y = -x; x = -temp; }
    }
    x = parseInt(x*1000000000/10).toString();
    y = parseInt(y*1000000000/10).toString();
    var lenx=x.length, leny=y.length, len=(lenx>leny)?lenx:leny, sum="", div=0, x1, y1, rem;
    for (var i = 0; i < len; i++) {
        x1 = (i >= lenx) ? 0 : parseInt(x[lenx-i-1]);
        y1 = (i >= leny) ? 0 : parseInt(y[leny-i-1]);
        y1 = (isNaN(y1)) ? 0 : y1;
        if (oneNeg) y1 = -y1;
        if (borrow) x1 = x1 - 1;
        if (y < 0 && x1 > 0 && Math.abs(x1) >= Math.abs(y1)) { borrow=false; div=0; }
        if (y < 0 && y1 <= 0 && (x1 < 0 || Math.abs(x1) < Math.abs(y1))) { borrow=true; rem=(x1+y1+div+10)%10; div=10; }
        else { rem=(x1+y1+div)%10; div=Math.floor((x1+y1+div)/10); }
        sum = Math.abs(rem).toString() + sum;
    }
    if (div > 0) sum = div.toString() + sum;
    sum = parseFloat(sum*10/1000000000);
    if (bothNeg || neg) sum = -sum;
    return sum;
}
  • How does it work? This will not give an expected result `add(9999999999999999999999999999999999999999999999999999999999999999999999999999,999999999999999999999999999999999999999)` – Qwerty Nov 04 '20 at 16:43
-3
 <body>
<p>Click the button to calculate x.</p>
<button onclick="myFunction()">Try it</button>
<br/>
<br/>Enter first number:
<input type="text" id="txt1" name="text1">Enter second number:
<input type="text" id="txt2" name="text2">
<p id="demo"></p>
<script>
  function myFunction() {
    var y = document.getElementById("txt1").value;
    var z = document.getElementById("txt2").value;
    var x = +y + +z;
    document.getElementById("demo").innerHTML = x;
  }
</script>

https://jsfiddle.net/Sanjeevgaut/mtsL1k2x/

Sanjeev Gautam
  • 353
  • 3
  • 15