2017-03-11 81 views
3

被替换我的数组的最后一个元素我有一个函数:为什么用0

function splitToDigits(n) { 
    var digits = ("" + n).split("").map(function(item) { 
     return parseInt(item, 10); 
    }); 
    console.log(digits); 
} 

console.log(splitToDigits(123456784987654321)); 

这是返回digits = [1,2,3,4,5,6,7,8,4,9,8,7,6,5,4,3,2,0]

任何想法为什么最后一个元素是0?我注意到,当我从数组中删除2个元素时,它正常工作。感谢所有伟大的答案! :)

+6

它代替了数字末尾的'1' - 由于Numbers中的精度限制...'console.log(123456784987654321)'查看问题 –

+0

您可以使用Number .isSafeInteger':'Number.isSafeInteger(123456784987654321)'是错误的,所以你不一定要区分它与其他整数。 – Ryan

+1

请注意,您可以执行'('+ n).split('')。map(Number)'来保存一些输入内容。 ;-) – RobG

回答

1

由于Jaromanda X在上面的注释部分中提到,JavaScript没有足够的精度跟踪传递给函数的整数中的每个数字。

要解决这个问题,你应该将传递一个字符串:

console.log(splitToDigits('123456784987654321')) 

不过,我也想指出的是您可以大大简化您的splitToDigits方法:

function splitToDigits(n) { 
 
    return [].map.call(n + '', Number) 
 
} 
 

 
console.log(splitToDigits('123456784987654321')) 
 
console.log(splitToDigits(1234))

+0

好的,但如果我以后以不同的顺序去parseInt()那个相同的数字,它会做同样的事情吗? –

+1

如果你尝试调用'parseInt'来存储一个太大的整数,不能存储在JavaScript中,你将不可避免地失去一些精度。您可以使用字符串代替,也可以使用上述方法保留数字列表。 – gyre

1

这是因为JavaScript正在截断数字。

看到这一点的最好办法是这样的console.log:

function splitToDigits(n) { 
console.log(n); 
var digits = ("" + n).split("").map(function(item) { 
    return parseInt(item, 10); 
}); 
} 

然后,当你运行:splitToDigits(123456784987654321),你已经得到123456784987654320.因此,它没有任何与你的代码做你还没有处理它。

如果添加数字,它变成科学记数法:

splitToDigits(1234567849876543211521521251) // turns to 1.2345678498765432e+27 

这是一个Javascript精度问题。这就是全部:)