Длинная арифметика в 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