Объект Math в JavaScript — это незаметный пояс с инструментами языка. Его никогда не нужно инициализировать. Его никогда не нужно импортировать. Он просто существует в каждой среде выполнения, готовый выполнить любую задачу: от округления значения пикселя до генерации случайного броска кубика. Поскольку Math является статическим объектом, каждый метод и свойство привязаны непосредственно к пространству имен. Вы пишете Math.PI, а не new Math().PI. Такое проектное решение упрощает работу, но также означает, что у объекта есть несколько «острых углов», которые стоит изучить, прежде чем полагаться на него в рабочей логике.

Статический объект без конструктора

Большинство встроенных объектов JavaScript требуют создания экземпляра. Вы вызываете new Date() или new Array(). Math отказывается. Он спроектирован как пространство имен связанных функций и констант, работающих с примитивным типом Number. Вызовите Math.sqrt(16), и вы получите 4. Попробуйте использовать ключевое слово new, и движок выдаст TypeError. Такой паттерн позволяет экономить память и сигнализирует о том, что Math является чисто функциональным. Он принимает входные данные, возвращает результаты и ничего не изменяет.

Есть одно строгое ограничение, о котором стоит помнить: Math работает со стандартными числами IEEE 754. Он не работает с BigInt. Передайте BigInt в Math.round() или Math.abs(), и вы получите TypeError. Если ваше приложение работает с 64-битными целыми числами или больше, вам нужно либо привести их к обычному типу, либо использовать нативные операторы BigInt для арифметических операций.

Константы, которые вы действительно используете

Объект Math предоставляет несколько числовых констант, которые избавляют вас от необходимости прописывать «магические числа» вручную.

  • Math.PI — знакомое 3.14159..., необходимо для всего, что связано с кругами, тригонометрией или преобразованием градусов в радианы.
  • Math.E — число Эйлера, примерно 2.718. Оно встречается в кривых экспоненциального роста, расчетах сложных процентов и логарифмических шкалах.
  • Math.SQRT2 — квадратный корень из двух, примерно 1.414. Он удобен, когда вам нужно найти диагональ квадрата или нормализовать векторы в простой геометрии.
  • Math.LN2 — натуральный логарифм 2, примерно 0.693. Вы встретите его в алгоритмах, работающих с бинарными деревьями, энтропией информации или анализом временной сложности с использованием логарифмов по основанию 2.

Эти значения являются числами с плавающей запятой двойной точности. Поскольку это свойства, а не методы, вы обращаетесь к ним без скобок.

Округление, знаки и абсолютные значения

Самые распространенные задачи с Math связаны с «очисткой» чисел. JavaScript предоставляет четыре метода округления, и они ведут себя по-разному, особенно когда вы выходите за пределы положительных чисел.

Math.abs(x) возвращает модуль числа. Передайте ему -42, и вы получите 42. Это полезно, когда вам важна дистанция, а не направление. Например, при сравнении временных меток, расчете дельты перетаскивания в интерфейсе или проверке, попадает ли значение в диапазон погрешности.

Math.round(x) — это школьный метод округления. Он округляет до ближайшего целого, при этом дробная часть 0.5 округляется вверх к следующему положительному целому. Таким образом, 4.4 превращается в 4, а 4.5 — в 5.

Math.ceil(x) всегда округляет вверх до ближайшего целого. 4.1 превращается в 5, а -4.9 — в -4. Последний случай часто удивляет людей. Поскольку на числовой прямой -4 больше, чем -4.9, ceil для отрицательных чисел движется в сторону нуля.

Math.floor(x) — это противоположность. Он всегда округляет вниз. 4.9 превращается в 4, а -4.1 — в -5. Если вы реализуете пагинацию результатов поиска или выделяете блоки памяти фиксированного размера, floor — это обычно то, что вам нужно.

Math.trunc(x) полностью отсекает дробную часть, оставляя только целую. По сути, он движется в сторону нуля независимо от знака. 4.9 превращается в 4, а -4.9 — в -4. Если вы переносите логику из языков, где числа с плавающей запятой приводятся к целым путем отсечения дробной части, этот метод станет вашим лучшим другом.

Наконец, Math.sign(x) сообщает, с какой стороны от нуля находится значение. Он возвращает 1 для положительных чисел, -1 для отрицательных, 0 для положительного нуля, -0 для отрицательного нуля и NaN для всего остального. Это лаконичный способ разветвления логики в зависимости от направления без написания цепочки if-else.

Генерация случайных чисел

Math.random() генерирует псевдослучайное число с плавающей запятой в диапазоне от 0 (включительно) до 1 (исключительно). Оно не является криптографически безопасным, поэтому не используйте его для генерации паролей, создания токенов или любых задач, связанных с реальными деньгами.