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 15
  • 4341 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. ссылка

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