9933272057275866 это магическое число?
Я столкнулся с проблемой и не могу ее объяснить. На самом деле я очень удивлен. Когда я пытаюсь увеличить число 9933272057275866 на 1, оно автоматически добавляет 2!!! Пожалуйста, смотрите следующий код:
let test = 9933272057275866;
let test2 = test+1;
console.log('Before:', test);
console.log('After:', test2);
console.log('Sub:', test2-test);
И соответствующий вывод:
Before: 9933272057275866
After: 9933272057275868
Sub: 2
Как это может быть возможным?
Окружающая среда - это Javascript. Я обнаружил эту проблему, когда отправил запрос на Hackerrank, а затем попытался сделать то же самое в моей собственной среде на node.js. Тот же результат!
Что происходит?
1 ответ
По сути, это потому, что 64 бита (*) недостаточно для точного представления числа.
4341 A521 1037 32ED
: 9,93327205727586 6 15 10 154341 A521 1037 32EE
: 9.93327205727586 8 15 10 15
Посмотрите, как оно пропускает одно целое число между ними. В IEEE 754, чем выше вы идете, тем больше чисел разбросаны по числовой линии. Следует иметь в виду, что числа с плавающей запятой являются приблизительными. Вот почему вы получаете этот результат:
0.1 + 0.2 === 0.3 // false
Максимальное безопасное целое число в IEEE 754 составляет 9007199254740991.
Более интересные факты с арифметикой с плавающей точкой:
A + B == B + A // true, commutative, except when A or B is NaN
(A + B) + C == A + (B + C) // false, not associative
* Стоит отметить, что числа в JavaScript (ECMAScript) представлены в виде 64-битных двойных кодов IEEE 754. ссылка