Числа¶
Всякий раз, когда вы работаете с числами в любом языке программирования, вы должны знать об особенностях обработки чисел в этом языке. Далее несколько важных моментов о числах в JavaScript, которые вы должны знать.
Основной тип¶
В JavaScript есть только один числовой тип. Это 64-битный Number с двойной точностью. Далее мы рассмотрим его ограничения и рекомендуемые решения.
Десятичные числа¶
Для тех, кто знаком с doubles / float в других языках, важно знать, что двоичные числа с плавающей запятой обрабатываются некорректно. Известный пример некорректной работы с числами в JavaScript:
1 | |
Для корректных математических вычислений используйте big.js, упоминаемый ниже.
Целые числа¶
Ограничения для целых чисел представлены встроенным числовым типом и составляют Number.MAX_SAFE_INTEGER и Number.MIN_SAFE_INTEGER.
1 2 3 4 5 | |
Безопасно в данном контексте означает, что полученное значение не может быть результатом ошибки округления.
Небезопасные значения находятся на расстоянии +1 / -1 от безопасных значений и при любых сложениях/вычитаниях результат будет округлен.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
Для проверки безопасности вычислений можно использовать ES6 Number.isSafeInteger:
1 2 3 4 5 6 7 8 9 10 11 12 | |
JavaScript в будущем будет поддерживать BigInt. Но сейчас, если вы хотите целочисленных математических вычислений произвольной точности, вы можете использовать big.js.
big.js¶
Всякий раз, когда вы используете математику для финансовых расчетов (например, расчет налогов, деньги с центами, сложение/вычитание и тд) используйте библиотеки типа big.js, которые предназначены для:
- Идеальной десятичной математики
- Безопасных вычислений нецелочисленных значений
Установка проста:
1 | |
Пример использования:
1 2 3 4 5 6 7 8 9 | |
Не используйте эту библиотеку для вычислений на UI / тяжелых по производительности задач, например, для построения графиков и т. п.
NaN¶
Когда результат какого-либо вычисления не является действительным числом, JavaScript возвращает специальное значение NaN. Классический пример ниже:
1 | |
Запомните: Проверка на равенство не работает с NaN. Используейте Number.isNaN:
1 2 3 4 5 | |
Infinity¶
Внешние границы значений, представленных в Number, доступны в виде статических значений Number.MAX_VALUE и -Number.MAX_VALUE.
1 2 | |
Значения за пределами этого диапазона, где точность не изменяется, находятся в тех же пределах, например:
1 2 | |
Значения за пределами этого диапазона, где точность изменяется, преобразуются в специальные значения Infinity/-Infinity, например:
1 2 | |
Конечно, эти специальные значения также отображаются при вычислениях, для которых они необходимы, например:
1 2 | |
Вы можете использовать Infinity вручную или использовать статичные члены класса Number:
1 2 | |
К счастью, операторы сравнения (< / >) умеют корректно работать с Infinity значениями:
1 2 | |
Бесконечно малые числа¶
Наименьшее ненулевое значение представлено в Number как статичный член Number.MIN_VALUE
1 | |
Все значения, которые меньше, чем MIN_VALUE, конвертируются в 0.
1 | |
Интуитивно: Только значения, которые больше, чем Number.MAX_VALUE, приводятся к INFINITY, значения, которые меньше, чем Number.MIN_VALUE, приводятся к 0.