JavaScript NaN大整数错误

时间:2018-07-05 11:43:47

标签: javascript

所以我正在计算序列的最后十位数:

1 ^ 1 + 2 ^ 2 + 3 ^ 3 + ... + 1000 ^ 1000

但是我一直得到NaN。

代码:

function myFunction() {
  var i, x, a, sum = 0; {
    for (i = 1; i <= 1000; i++) {
      var a = Math.pow(i, i);
      sum += a;
    }
    var x = sum;
    var y = x % 10000000000;

  }

  document.getElementById("demo").innerHTML = y;
}
<p>Click the button to demontrate </p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>

6 个答案:

答案 0 :(得分:1)

 Math.pow(1000, 1000)

那是一个非常非常大的数字(3000个零),所以javascript无法处理它,这就是上述结果为Infinity的原因。而且无法确定无限数的模,因此结果不是数字。

答案 1 :(得分:0)

JavaScript对所有内容都使用64位浮点数。其中之一的最大值约为1.8×10 ^ 308,比您的1000 ^ 1000的值小很多。结果,由于它尝试计算的数字无法放入“数字”类型的变量中,因此Javascript返回NaN并保留该数字。

答案 2 :(得分:0)

Number.MAX_VALUE是可用的最大数量。

否则,您必须使用一些库,例如:https://mikemcl.github.io/bignumber.js/

答案 3 :(得分:0)

说明

JS目前不支持大整数(大于(2 ^ 31-1),如@suhas所述),但是目前在阶段3(候选)中有a TC39 draft

解决方案

同时,使用库such as this one

答案 4 :(得分:0)

您有一个无穷大值,请尝试下面的代码:

function myFunction() {

  var i, x, a, sum = 0; {
    for (i = 1; i <= 1000; i++) {
      var a = Math.pow(i, i);
      if(a!=Infinity)sum += a;
    }
    var x = sum;
    var y = x % 10000000000;
 document.getElementById("demo").innerHTML = y;
  }

答案 5 :(得分:0)

正如@ jonas-w正确指出的那样,您的特定问题是尝试取无数的模。 infinity % anyNumber产生NaN。

此外,您需要了解浮点值使用科学计数法。这意味着对于较大的数字,您所有的有效数字(JavaScript所使用的IEEE 754双精度数字为53)都位于该值的上限,而您的模数却位于该值的下限。

例如,1.1×10 ^ 6是1,100,000,1.2×10 ^ 6是1,200,000。获得% 100是毫无意义的,因为两者都得出0。

您要用此代码完成什么工作?