以下是我的代码,其中适用于较小的数组编号,但如果我在方法中使用大尺寸数组,则会给出奇怪的答案 -
代码 -
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]
让我知道我在这里做错了什么,修复是什么?
答案 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)
你正在做的就是找麻烦。
你是:
当您尝试使用可以连接到整数9223372036854775808
的整数数组执行此操作时,会出现问题。这大于Number.MAX_SAFE_INTEGER
,因此您对parseInt(count)
的调用不会返回您的预期。 (在这种情况下为9223372036854776000
)。
此外,接受的最佳做法是完全避免==
和!=
。始终使用严格质量的运算符===
和!==
。
答案 4 :(得分:-1)
两个问题:
0
和0 == null
内将0 == undefined
丢弃在数组中。您需要使用===
检查值和类型是否相等。if (x > 10 || x < 0 || x === null || x === undefined)