【问题标题】:How to add two big numbers in javascript?如何在javascript中添加两个大数字?
【发布时间】:2017-06-16 14:22:28
【问题描述】:

我有两个文本框。每个都将输入多达千位数。

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

我试过这个:

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

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

【问题讨论】:

  • 使用其中一个错误编号库。
  • 你的号码有多大
  • 高达千位数 @REHANSHIKKALGAR
  • 我试图输入号码,但它没有发布我的问题,这就是我更改它的原因。 @LKTN.25

标签: javascript


【解决方案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/

【讨论】:

  • 您能解释一下为什么+y+z 会有所作为吗?
  • input up to thousand digits
  • 如果不放+则视为字符串,如果加上+var则仅视为数字。
  • 嘿,我希望我的解决方案运行良好?我也分享了工作链接。
  • 他不想得到指数形式的结果。尝试输入大数字
【解决方案2】:

要么使用像 https://mathjs.org/docs/datatypes/bignumbers.html 这样的大数字库,或者你可以使用像 http://www.discoversdk.com/knowledge-base/arbitrary-length-integer-addition-in-javascript 这样更轻量(但易于理解)的东西

【讨论】:

    【解决方案3】:

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

     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/

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

    【讨论】:

      【解决方案4】:

      这是另一种解决方案,与您在互联网上找到的其他解决方案没有太大区别(请注意它不适用于负数!):

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

      【讨论】:

        【解决方案5】:

        好吧,如果您想在不使用 BigInt 或任何第三方库的情况下执行此操作,那么我认为您不需要转换为数组,您可以使用 charAt() 函数在每个字符处添加单个字符点在字符串中。您将不得不使用 for 循环,从最大值开始并减少到最小值。代码sn-p如下;

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

        【讨论】:

          【解决方案6】:
          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;
          }
          

          【讨论】:

          • 它是如何工作的?这不会给出预期的结果add(9999999999999999999999999999999999999999999999999999999999999999999999999999,999999999999999999999999999999999999999)
          【解决方案7】:

          另一种解决方案,因为它更快更干净。

          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"
          

          【讨论】:

          • 返回 sum.startsWith("0") ? sum.substring(1):sum;避免从任何零开始
          • @Malik 它以什么值向您返回领先的0
          【解决方案8】:

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

          const z = BigInt(x) + BigInt(y);
          
          console.log(z.toString());
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-10-15
            • 1970-01-01
            • 2016-01-15
            • 1970-01-01
            • 2021-12-22
            • 2022-01-16
            • 1970-01-01
            相关资源
            最近更新 更多