Number

Кожного разу, коли ви працюєте з числами в будь-якій мові програмування, ви повинні знати про особливості роботи з числами в цій мові. Ось кілька важливих фрагментів інформації про числа в JavaScript, про які вам варто знати.

Основний тип

У JavaScript є лише один тип чисел. Це 64-бітне число подвійної точності Number. Нижче ми обговоримо його обмеження разом з рекомендованим рішенням.

Десятковий тип

Для тих, хто знайомий з типами даних "double" або "float" в інших мовах програмування, відомо, що двійкові плаваючі числа не відображаються правильно на десяткові числа. На приведеному нижче прикладі з використанням вбудованих чисел JavaScript це можна побачити:

console.log(.1 + .2); // 0.30000000000000004

Для справжньої десяткової математики використовуйте big.js, згаданий нижче.

Цілі числа

Максимальне та мінімальне значення цілих чисел, представлене вбудованим типом Number, це Number.MAX_SAFE_INTEGER та Number.MIN_SAFE_INTEGER.

console.log({max: Number.MAX_SAFE_INTEGER, min: Number.MIN_SAFE_INTEGER});
// {max: 9007199254740991, min: -9007199254740991}

Безпечне в цьому контексті означає, що значення не може бути результатом помилки округлення.

Небезпечні значення знаходяться на відстані +1 / -1 від цих безпечних значень, і будь-яке додавання / віднімання призведе до округлення результату.

console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2); // true!
console.log(Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER - 2); // true!

console.log(Number.MAX_SAFE_INTEGER);      // 9007199254740991
console.log(Number.MAX_SAFE_INTEGER + 1);  // 9007199254740992 - Correct
console.log(Number.MAX_SAFE_INTEGER + 2);  // 9007199254740992 - Rounded!
console.log(Number.MAX_SAFE_INTEGER + 3);  // 9007199254740994 - Rounded - correct by luck
console.log(Number.MAX_SAFE_INTEGER + 4);  // 9007199254740996 - Rounded!

Для перевірки безпеки можна використовувати ES6 Number.isSafeInteger:

JavaScript з часом отримає підтримку BigInt. Наразі, якщо вам потрібна цілочисельна математика довільної точності, використовуйте big.js, згаданий нижче.

big.js

Кожного разу, коли ви використовуєте математику для фінансових розрахунків (наприклад, розрахунок GST, гроші з центами, додавання тощо), використовуйте бібліотеку на кшталт big.js, яка призначена для

  • Точної десяткової математики

  • Захисту цілочисельних значень поза межами обмежень

Встановлення просте:

Приклад швидкого використання:

Не використовуйте цю бібліотеку для математичних обчислень, що застосовуються в інтерфейсах, вимогливих до продуктивності, наприклад, для побудови діаграм, малювання на canvas тощо.

NaN

Коли деякі обчислення не можуть бути представлені дійсним числом, JavaScript повертає спеціальне значення NaN. Класичним прикладом є уявні числа:

Зауваження: Перевірка на рівність не працює для значень NaN. Замість цього використовуйте Number.isNaN:

Нескінченність (Infinity)

Зовнішні межі значень, які можна представити в Number, доступні у вигляді статичних значень Number.MAX_VALUE та -Number.MAX_VALUE.

Значення, які виходять за межі діапазону, де точність не змінюється, обмежуються цими межами, наприклад:

Значення, які виходять за межі діапазону, де точність змінюється, перетворюються на спеціальні значення Infinity/-Infinity, наприклад:

Звичайно, ці спеціальні значення "Infinity" також виникають при арифметичних операціях, що вимагають їх використання, наприклад:

Ви можете використовувати ці значення Infinity вручну або використовувати статичні члени класу Number, як показано нижче:

На щастя, оператори порівняння (< / >) надійно працюють зі значеннями "Infinity":

Інфінітезимальний (Infinitesimal)

Найменше ненульове значення, яке можна представити в Number, доступне як статичне Number.MIN_VALUE.

Значення, менші за MIN_VALUE ("значення недоповнення"), перетворюються на 0.

Далі за аналогією: Подібно до того, як значення, більші за Number.MAX_VALUE обмежуються до INFINITY, значення, менші за Number.MIN_VALUE обмежуються до 0.

Last updated