2017-03-11 82 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精度問題。這就是全部:)