Чи

Числа у JavaScript

20 вправ

Про концепцію Числа

У JavaScript є два різні види чисел: числа та «bigint».

Числа використовуються найчастіше: вони представляють числовий тип даних у форматі 64-бітного числа з плаваючою комою подвійної точності.

  • number: числовий тип даних у форматі 64-бітного числа з плаваючою комою подвійної точності (IEEE 754). Приклади: -6, -2.4, 0, 0.1, 1, 3.14, 16.984025, 25, 976, 1024.0 і 500000.
  • bigint: числовий тип даних, який може представляти цілі числа у форматі довільної точності. Приклади: -12n, 0n, 4n і 9007199254740991n.
let numericValue = 42;
// => 42

Літерал числа, як-от 42, у коді JavaScript - значення з плаваючою комою, а не ціле число. Окремого типу для цілих чисел у повсякденному вжитку немає. Тип bigint не створений для того, щоб замінити тип number у повсякденному використанні. 42 усе ще належить до Number, а не до BigInt.

Числа також можна записати в таких літеральних формах, як 0b101, 0o13, 0x0A. Докладніше про числову лексичну граматику тут.

Спеціальні позначення

Експоненційне позначення

E-запис позначає число, яке слід помножити на 10 у заданому степені. Формат E-запису такий: число, потім e або E, а далі степінь десяти, на який множимо.

const num = 3.125e7;
// => 31250000
// The notation essentially says, "Take 3.125 and multiply it by 10^7".

E-запис також дає змогу подати дуже малі числа:

const num = 325987e-6; // Equals 0.325987
// The notation essentially says, "Take 325987 and multiply it by 10^-6.

Позначення з підкресленнями

Підкреслення допомагають зробити великі числа зручнішими для читання. Компілятор повністю ігнорує ці підкреслення.

const num = 1_000_000; // You can read this as 1,000,000
console.log(num);
// => 1000000

Вбудований обʼєкт

Є два вбудовані обʼєкти, які стають у пригоді під час роботи з числами:

Math також містить методи для округлення чисел. Докладніше про доступні варіанти округлення можна прочитати в статті javascript.info про округлення.

Math.floor(234.34); // => 234
Math.ceil(234.34); // => 235

Вбудований глобальний object Number також є глобальною function, яку можна використати, щоб перетворити майже будь-що схоже на число в number. Він менш поблажливий, ніж розбір string у number.

const date = new Date('December 17, 1995 03:24:00');
const unix = Number(date);

unix;
// => 819199440000

У JavaScript є три види максимальних (а також мінімальних і максимальних відʼємних) значень для чисел:

  • VALUE: задаються через Number.MAX_VALUE і Number.MIN_VALUE
  • INFINITY: задаються через Number.POSITIVE_INFINITY і Number.NEGATIVE_INFINITY
  • SAFE_INTEGER: задаються через Number.MAX_SAFE_INTEGER і Number.MIN_SAFE_INTEGER

Через те, як реалізовано числа в JavaScript, не кожне число між Number.MIN_VALUE і Number.MAX_VALUE можна подати. Однак кожне число між Number.MIN_SAFE_INTEGER - 1 і Number.MAX_SAFE_INTEGER + 1 можна подати.

Спеціальні числові значення

У JavaScript є кілька спеціальних числових значень:

  • Два значення-помилки: NaN і Infinity.
  • Два значення для нуля: +0 і -0.

NaN - не число

Значення-помилка NaN (також відоме як «не число») виникає в таких випадках.

  • Число не вдалося розібрати:
    Number('123'); // => 123
    Number('Hello, World!'); // => NaN
    
  • Операція не вдалася:
    Math.sqrt(-64); // => NaN
    
  • Один з операндів дорівнює NaN:
    NaN + 69; // => NaN
    

NaN - єдине значення, яке не дорівнює саме собі:

NaN === NaN; // => false

Щоб перевірити, чи значення є NaN, потрібно скористатися глобальною функцією isNaN():

isNaN(NaN); // => true
isNaN(123); // => false

Infinity

Infinity - значення-помилка, яке вказує на одну з двох проблем:

  • Число неможливо подати, бо його величина занадто велика.
    Math.pow(2, 1024); // => Infinity
    
  • Сталося ділення на нуль.
    6 / 0; // => Infinity
    -6 / 0; // => -Infinity
    

Infinity більше за будь-яке інше число (крім NaN). Так само -Infinity менше за будь-яке інше число (крім NaN)

Глобальна функція isFinite() дає змогу перевірити, чи значення є справжнім числом (ні нескінченним, ні NaN):

isFinite(80085); // => true
isFinite(Infinity); // => false
isFinite(NaN); // => false

Два нулі

+0 і -0 - різні числа в JavaScript. Вони можуть виникнути, якщо ми представили число настільки мале, що його не відрізнити від 0. Знаковий нуль дає змогу зафіксувати, «з якого боку» ми наближалися до нуля, тобто який знак мало число, перш ніж його почали вважати нулем. Найкраща практика - вдавати, ніби нуль лише один.

Порівняння

Числа вважаються рівними, якщо вони мають однакове значення.

1 == 1.0;
// => true

1 === 1.0;
// => true
// Remember, all numbers are floating-points, so this is
// different syntax for the exact same value.

1 === 1n;
// => false
// Strictly checking a number against a bigint will always result
// in false.

Докладніше про порівняння загалом і про порівняння числових значень у JavaScript можна прочитати в концепції порівняння.

Пастки

Числа в JavaScript мають формат з плаваючою комою, тому вся математика з цими значеннями відбувається з плаваючою комою. Тому в JavaScript:

0.1 + 0.2 === 0.3;
// => false

Коротке пояснення є на сайті 0.30000000000000004.com, а докладне - у Додатку D з «Numerical Computation Guide» від Oracle під назвою «What Every Computer Scientist Should Know About Floating-Point Arithmetic».

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Числа

Практика заблокована

Розблокуйте ще 1 вправу, щоб практикувати концепцію Числа