Длинная арифметика в JavaScript

Длинная арифметика в JavaScript

@honey_and_money

В любом языке программирования существует так называемая граница любого типа - в прошлой статье мы убедились в этом. Например, в какой то момент очень большое число представляется просто как бесконечность и значение у него толком не определено. То же самое и с очень маленькими числами (только тут уже идет обобщение в сторону нуля, а не бесконечности).


Но у очень больших и очень маленьких чисел есть особенность - если они еще имеют какое-то значение (а не Infinity или ноль), то арифметические операции с ними могут быть неточными.

Проверим это. В принципе очевидно какой результат будет у этого выражения:


Но в консоли мы увидим следующее:

Странно, правда? На самом деле этому есть объяснение.

В памяти компьютера дробные числа имеют неточное представление - то есть например идет сохранение точности до какого-то определенного порядка, а дальше идут примерные значения. Отсюда в нашем примере и вылезла четверка. То есть в памяти компьютера введенные числа для сложения выглядят так:

0.1 = 0.100000...000133512...

0.2 = 0.200000...000342159...

В результате сложения получилась так четверка - сложились меньшие порядки, а все предшествующие им числа округлились.

В общем пока не углубляйтесь сильно в длинную арифметику - просто знайте, что у операций с очень маленькими или большими числами есть такой эффект.

Ах да, арифметика называется длинной из-за того, что работа идет с длинными числами - вот так всё однозначно)

Попробуйте проверить результаты умножения, деления, вычитания на очень больших и очень маленьких числах в JS и сравните их с результатом таких же операций в калькуляторе - гарантированно увидите различия.


С методами борьбы с такими случайно вылезающими маленькими и большими порядками познакомимся позже, когда уже будем уверены в знании основ.


И последнее что я хочу разобрать в блоке статей про тип число:

В прошлой статье мы открыли для себя тип NaN - Not a Number

Так вот, это не является каким-либо заранее определенным значением (константой). Это просто обозначения какой-то неизвестной языку JS сущности.

Следовательно вот такая операция:

Вернет такой результат:

Получается что любой NaN не равен любому другому NaN

Самое главное запомнить это свойство - сильно пригодится в будущем при обработке ошибок


@honey_and_money - Создай свой бизнес в IT

Report Page