Об'єкт 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.

Ці значення є числами з подвійною точністю (double-precision floats). Оскільки вони є властивостями, а не методами, ви звертаєтеся до них без дужок.

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

Найпоширеніші завдання Math пов'язані з приведенням числа до потрібного вигляду. JavaScript надає чотири методи округлення, і вони поводяться неоднаково, особливо коли ви виходите за межі додатних значень.

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

Math.round(x) — це класичне шкільне округлення. Він бере найближче ціле число, округлюючи половини в бік більшого додатного цілого числа. Отже, 4.4 стає 4, а 4.5 стає 5.

Math.ceil(x) завжди округлює вгору до наступного цілого числа. 4.1 стає 5, а -4.9 стає -4. Останнє часто дивує людей. Оскільки -4 більше за -4.9 на числовій прямій, "стеля" (ceiling) для від'ємних чисел рухається в бік нуля.

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 (не включно). Воно не є криптографічно стійким, тому не використовуйте його для генерації паролів, створення токенів або будь-чого, що пов'язано з реальними грошима.