在javascript中添加数组时获得奇怪的结果

时间:2016-01-06 21:51:23

标签: javascript arrays integer

以下是我的代码,其中适用于较小的数组编号,但如果我在方法中使用大尺寸数组,则会给出奇怪的答案 -

代码 -

function upArray(arr){
  var fail = false,
      count = '';
  arr.map(function(x){
    if(x>10 || x<0 || x== null || x== undefined)
      fail = true;
    else {
      count += x.toString();
      fail = false;
    }
  })
  if(arr.length < 1)
    fail = true;
  return fail ? null : (parseInt(count)+1).toString().split("").map(function(x){return parseInt(x);});
}

更正结果 -

console.log(upArray([2,4,5])); //[2,4,6]
console.log(upArray([2,5,1])); //[2,5,2]
console.log(upArray([2,8,9])); //[2,9,0]

但是 - 如果我提供大量数字,它会给出奇怪的结果 -

喜欢 -

console.log(upArray([9,2,2,3,3,7,2,0,3,6,8,5,4,7,7,5,8,0,8]));

给予 - [9, 2, 2, 3, 3, 7, 2, 3, 6, 8, 5, 4, 7, 7, 5, 8, 0]

让我知道我在这里做错了什么,修复是什么?

5 个答案:

答案 0 :(得分:1)

您的parseInt(count)+1超出JavaScript中的最大安全整数Number.MAX_SAFE_INTEGER,这会产生意外结果。

可能的工作实施可能是:

function upArray(arr){
  var result = [],
      remaining = 1;
  while (arr.length) {
    var x = arr.pop();
    if (x > 10 || x < 0 || x == null) { // x == null works for undefined as well
      return null;
    }
    if (remaining) {
      var _x = x + remaining;
      x = _x % 10;
      remaining = Math.floor(_x / 10);
    }
    result.unshift(x);
  }
  if (remaining) {
    result.unshift(remaining);
  }
  return result;
}

这是有效的,因为它从右边开始逐个递增整数,直到没有溢出(溢出从9到0)。

答案 1 :(得分:0)

您提供的输入大于JavaScript支持的最大整数,即+/- 9007199254740991.它仅支持53位整数。请参阅What is JavaScript's highest integer value that a Number can go to without losing precision?

答案 2 :(得分:0)

就像danmcardle所说,你的整数太大了。 看看这个问题:What is JavaScript's highest integer value that a Number can go to without losing precision?

此外,我认为您的代码可以进行优化。

function upArray(nr){
  nr++;
  var nrString = nr.toString();
  return nrString.split('');
}

答案 3 :(得分:0)

你正在做的就是找麻烦。

你是:

  1. 将整数数组映射为单字符串并连接
  2. 将结果解析为整数
  3. 将1添加到整数
  4. 将结果转换为字符串并拆分为单字符数组
  5. 将每个字符解析为整数。
  6. 当您尝试使用可以连接到整数9223372036854775808的整数数组执行此操作时,会出现问题。这大于Number.MAX_SAFE_INTEGER,因此您对parseInt(count)的调用不会返回您的预期。 (在这种情况下为9223372036854776000)。

    此外,接受的最佳做法是完全避免==!=。始终使用严格质量的运算符===!==

答案 4 :(得分:-1)

两个问题:

  1. 您的上一个值大于JavaScript支持的maximum integer value
  2. 即使是较小的数字,您也会在00 == null内将0 == undefined丢弃在数组中。您需要使用===检查值类型是否相等。
  3. if (x > 10 || x < 0 || x === null || x === undefined)