Перейти к содержимому

15. Числа: IEEE 754, BigInt, Math

Иллюстрация к уроку В JavaScript числа играют ключевую роль, будь то математические вычисления или работа с данными. В этом уроке мы разберемся с тем, как JavaScript представляет числа, познакомимся с ограничениями и способами их обхода, а также изучим полезные инструменты для работы с числами.

IEEE 754: Представление чисел с плавающей точкой

Заголовок раздела «IEEE 754: Представление чисел с плавающей точкой»

JavaScript использует формат IEEE 754 для представления чисел. Это означает, что большинство чисел (включая десятичные дроби) хранятся в памяти компьютера в виде чисел с плавающей точкой двойной точности (64 бита). Это приводит к некоторым особенностям. Например, некоторые десятичные дроби не могут быть представлены точно.

console.log(0.1 + 0.2); // Вывод: 0.30000000000000004

Это не ошибка JavaScript, а особенность представления чисел с плавающей точкой. Чтобы избежать проблем, связанных с неточностью, можно использовать методы округления:

console.log((0.1 + 0.2).toFixed(1)); // Вывод: "0.3" (строка)
console.log(Math.round((0.1 + 0.2) * 10) / 10); // Вывод: 0.3 (число)

toFixed() возвращает строку с указанным количеством знаков после запятой. Math.round() округляет число до ближайшего целого.

Когда требуются вычисления с целыми числами, превышающими Number.MAX_SAFE_INTEGER (2^53 - 1), на помощь приходит BigInt. Это специальный тип данных для представления произвольно больших целых чисел.

const largeNumber = 9007199254740991n; // Добавляем "n" в конце
const anotherLargeNumber = BigInt(9007199254740992);
console.log(largeNumber + 1n); // Вывод: 9007199254740992n
console.log(anotherLargeNumber); // Вывод: 9007199254740992n

Важно: BigInt не совместим с обычными числами. Операции можно проводить только между BigInt.

// console.log(largeNumber + 1); // Ошибка!
console.log(largeNumber + BigInt(1)); // Правильно

Объект Math предоставляет множество полезных математических функций и констант.

console.log(Math.PI); // Вывод: 3.141592653589793
console.log(Math.abs(-5)); // Вывод: 5 (абсолютное значение)
console.log(Math.pow(2, 3)); // Вывод: 8 (2 в степени 3)
console.log(Math.sqrt(9)); // Вывод: 3 (квадратный корень)
console.log(Math.random()); // Вывод: случайное число от 0 (включительно) до 1 (исключая 1)
console.log(Math.floor(3.7)); // Вывод: 3 (округление вниз)
console.log(Math.ceil(3.2)); // Вывод: 4 (округление вверх)
  • Финансовые расчеты: В финансовых приложениях часто требуется высокая точность, поэтому используют библиотеки, работающие с BigInt или десятичными числами (например, decimal.js) для избежания ошибок округления.
  • Криптография: При работе с криптографическими алгоритмами используются очень большие числа, которые обрабатываются с помощью BigInt.
  • Графика: Math используется для вычисления координат, углов, расстояний в играх, визуализациях данных и других графических приложениях. Например, для вращения элемента вокруг центра используется Math.sin() и Math.cos().
  • JavaScript использует IEEE 754 для представления чисел с плавающей точкой, что может приводить к неточностям.
  • BigInt позволяет работать с целыми числами произвольного размера.
  • Объект Math предоставляет множество полезных математических функций.
  • Выбирайте подходящий тип данных и методы работы с числами в зависимости от задачи.