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

如何在javascript中添加两个大数字?,javascript,Javascript,我有两个文本框。每个将接受多达千位的输入 现在我想把这两个数字相加。我的问题是我应该使用什么数据类型来存储结果 我试过这个: <script> var x = 'Thousand digit of number' var y = 'Thousand digit of number' var z = x + y </script> 变量x='数字的千位' 变量y='数字的千位' var z=x+y 但我得到的结果是指数形式的。如何存储结果并显示它

我有两个文本框。每个将接受多达千位的输入

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

我试过这个:

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

变量x='数字的千位'
变量y='数字的千位'
var z=x+y
但我得到的结果是指数形式的。如何存储结果并显示它?


 <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>
单击按钮以计算x

试试看

输入第一个数字: 输入第二个数字:

函数myFunction(){ var y=document.getElementById(“txt1”).value; var z=document.getElementById(“txt2”).value; var x=+y++z; document.getElementById(“demo”).innerHTML=x; }

可以使用大数字库,如,也可以使用较轻的(但容易理解的)库,如

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

 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;
       }
    }
函数添加(){
document.getElementById(“demo”).innerHTML=“”;
var x=document.getElementById(“txt1”).value;
var y=document.getElementById(“txt2”).value;
瓦伦;
var lenx=x.长度;
var leny=y.长度;
变量x1,y1,rem,div=0;
如果(lenx>leny)len=lenx;否则len=leny;
对于(var i=0;i=lenx)x1=0;
else x1=parseInt(x[lenx-i-1]);
如果(i>=leny)y1=0;
else y1=parseInt(y[leny-i-1]);
rem=(x1+y1+div)%10;
分区=数学楼层((x1+y1+div)/10);
document.getElementById(“demo”).innerHTML=rem+document.getElementById(“demo”).innerHTML;
}
如果(div>0){
document.getElementById(“demo”).innerHTML=div+document.getElementById(“demo”).innerHTML;
}
}
代码如下:


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

这里有另一个与internet上的其他解决方案没有太大区别的解决方案(请考虑它不适用于负数!):

函数和(arg1、arg2){
var sum=“”;
var r=0;
变量a1、a2、i;
//在我的算法中,选择最短的字符串作为第一个参数,选择最长的字符串作为第二个参数
如果(arg1.length0)
总和+=r;
sum=sum.split(“”.reverse();
//修剪前导的“0”
而(和[0]=“0”)
sum.shift();
返回sum.length>0?sum.join(“”:“0”;
}
//试验
功能测试质量(预期、实际){
如果(预期==实际)
console.log(“OK:+预期值);
其他的
控制台错误(“错误:+预期+”!=“+实际);
}
测试质量(“100”,总和(“99”,“1”);
测试质量(“100”,总和(“00099”,“0001”);
测试质量(“1000000000”,总额(“9999999999”,“1”);
测试质量(“100000101”,总和(“9999999999”,“10102”);
测试质量(“0”,总和(“0”,“0”);
测试质量(“1”,总和(“0”,“1”);
测试质量(“9”,总和(“8”,“1”);
测试质量(“9”,总和(“1”,“8”);

testEquals(“100000000000000000000000000000000”,合计(“999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999好吧,如果您不想使用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;

};
功能添加(a、b){
让sum='';
设z,x;
设r=0;
如果(a.length>=b.length){
z=a;
x=b;
}
否则{
z=b;
x=a;
};
设p=x.length;
对于(设i=z.length;i>0;i--){
设t=((p>0)parseInt(x.charAt(p-1)):0)+parseInt(z.charAt(i-1))+r;
总和=(t%10)+总和;
r=t0){sum=r+sum};
回报金额;
};
功能添加(x,y){
//此函数用于添加两个非常大的数字,负数和/或正数
var-temp,借入=false,bothNeg=false,oneNeg=false,负=false;
如果(x<0&&y<0){bothNeg=true;x=-x;y=-y;}
else如果(x<0 | | y<0){
oneNeg=真;
如果(Math.abs(x)==Math.abs(y)){x=0;y=0;}
else如果(x<0&&Math.abs(x)>Math.abs(y)){neg=true;x=-x;y=-y;}
else如果(x<0&&Math.abs(x)leny)?lenx:leny,sum=“”,div=0,x1,y1,rem;
对于(变量i=0;i=lenx)?0:parseInt(x[lenx-i-1]);
y1=(i>=leny)?0:parseInt(y[leny-i-1]);
y1=(isNaN(y1))?0:y1;
如果(oneg)y1=-y1;
如果(借用)x1=x1-1;
如果(y<0&&x1>0&&Math.abs(x1)>=Math.abs(y1)){borrow=false;div=0;}
如果(y<0&&y1 0)sum=div.toString()+sum;
总和=浮点数(总和*10/100000000);
如果(bothNeg | | neg)和=-和;
回报金额;
}

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

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
}


使用BigInt,如下所述:

常数z=BigInt(x)+BigInt(y); console.log(z.toString());
使用其中一个bug号码库。你的号码有多大?1000位数@REHANSHIKKALGARi试图输入这个号码,但没有发布我的问题,这就是我更改它的原因。@LKTN.25可能重复的。你能解释一下为什么
+y
+z
会产生不同吗?
如果你需要,请输入多达1000位数的
将不放置+然后将其视为字符串,如果我们
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"