如何在javascript中添加两个大数字?

时间:2017-01-31 08:14:36

标签: javascript

我有两个文本框。每个输入最多可输入千位数。

现在我要添加这两个数字。我的问题是我应该使用什么数据类型来存储结果?

我试过这个:

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

但我得到了指数形式的结果。如何存储结果并显示它?

8 个答案:

答案 0 :(得分:2)

这是另一种解决方案,与您在互联网上找到的其他解决方案没有什么不同(认为它不能与负数一起使用!):

&#13;
&#13;
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"));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

使用像https://mathjs.org/docs/datatypes/bignumbers.html这样的大数字库,或者你可以使用像http://www.discoversdk.com/knowledge-base/arbitrary-length-integer-addition-in-javascript

那样重量轻(但易于理解)的东西

答案 2 :(得分:0)

将数字输入为字符串,并将每个字符彼此添加为如下所示的数组:

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

此处代码为:https://jsfiddle.net/mtsL1k2x/5/

注意:这仅适用于自然数字。您可以根据输入进行修改

答案 3 :(得分:0)

好吧,如果您想在不使用BigInt或任何第三方库的情况下执行此操作,那么我认为您无需转换为数组,可以使用charAt()函数在每个位置添加单个字符指向字符串。您将不得不使用for循环,从其最大值开始,直到其最小值为止。代码段如下;

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;

};

答案 4 :(得分:0)

还有另一个解决方案,因为它更快,更干净。

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"

答案 5 :(得分:0)

按此处所述使用 BigInt:https://stackoverflow.com/a/56370672/641913

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

console.log(z.toString());

答案 6 :(得分:-1)

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

答案 7 :(得分:-1)

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