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 числа хранятся как числа с плавающей запятой двойной точности. Большие целые числа превышают диапазон точности двойников, поэтому они становятся неточными.