Swapnil Patil
Swapnil Patil

Reputation: 942

How to add two big numbers in javascript?

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?

Upvotes: 8

Views: 23747

Answers (10)

Sola Oderinde
Sola Oderinde

Reputation: 1046

function add(a, b){
  let sum = "";
  let remainder = 0;
  a = a.split("");
  b = b.split("");
  while (a.length || b.length || remainder) {
    remainder += ~~a.pop() + ~~b.pop();
    sum = (remainder % 10) + sum;
    remainder = remainder > 9;
  }
  return sum;
}

const sum = add("9999999999999999999999999999999999999999999999999999999999999999999999999999", "999999999999999999999999999999999999999");

console.log({sum})

Upvotes: 0

Riaz Bappy
Riaz Bappy

Reputation: 33

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("");
  }

Upvotes: 0

Liam
Liam

Reputation: 145

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

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

console.log(z.toString());

Upvotes: 7

Qwerty
Qwerty

Reputation: 31987

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"

Upvotes: 13

Dante Valenzuela
Dante Valenzuela

Reputation: 19

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;
}

Upvotes: -2

jamesnottidge
jamesnottidge

Reputation: 71

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;

};

Upvotes: 0

Nicolai Nita
Nicolai Nita

Reputation: 183

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"));

Upvotes: 2

mudin
mudin

Reputation: 2852

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

Upvotes: 1

ephraim
ephraim

Reputation: 21

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

Upvotes: 0

Sanjeev Gautam
Sanjeev Gautam

Reputation: 363

 <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/

Upvotes: -3

Related Questions