JavaScript максимальный размер числа отличается от конечных нулей

У меня есть номер n длиной 16 цифр (1111111111111111). Когда я добавлю еще 1 на этот номер (делая его 11111111111111111, 17 цифр) отображается как 11111111111111112,

Это понятно, потому что это больше, чем Number.MAX_SAFE_INTEGERОднако, если я добавлю 0 вместо этого (делая это 11111111111111110(по-прежнему 17 цифр), номер отображается правильно как 11111111111111110,

let a = 11111111111111111;
let b = 11111111111111110;

console.log(a, b); // 11111111111111112 11111111111111110

Поведение выше происходит с любой последней цифрой, кроме 0, В чем причина такой разницы в поведении?


Я посмотрел на "Большие числа, ошибочно округленные в Javascript", но это не объясняет, почему они округляются при добавлении ненулевого числа, а не при добавлении нуля.

1 ответ

Это связано с тем, что в Javascript числа хранятся как числа с плавающей запятой двойной точности. Большие целые числа превышают диапазон точности двойников, поэтому они становятся неточными.

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