Почему последний элемент моего массива заменяется на 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 элемента из массива, он работает нормально. Спасибо за все отличные ответы!:)

2 ответа

Решение

Как Jaromanda X в разделе комментариев выше, JavaScript не обладает достаточной точностью, чтобы отслеживать каждую цифру в целом числе, которое вы передали своей функции.

Чтобы решить эту проблему, вы должны вместо этого передать строку:

console.log(splitToDigits('123456784987654321'))

Тем не менее, я также хотел бы отметить, что вы можете значительно упростить splitToDigits метод:

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

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

Это потому что 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. Это все:)

Другие вопросы по тегам