Числа в JavaScript

Все числа в JavaScript хранятся в 64-битном формате IEEE-754, который также называют «числа с плавающей точкой двойной точности» (double precision floating point numbers).

Способы записи числа в JavaScript

Для укороченной записи больших чисел в JS используется буква «e», которая добавляется к числу и заменяет указанное количество нулей:

Другими словами, «e» производит операцию умножения числа на 1 с указанным количеством нулей.

Для укороченной записи малых чисел в JS также используется буква «e«, которая добавляется к числу и заменяет указанное количество нулей:

Шестнадцатеричные, двоичные и восьмеричные числа в JavaScript

Шестнадцатеричные числа широко используются в JavaScript для представления цветов, кодировки символов и многого другого.

Короткий стиль записи шестнадцатеричного числа:

  • 0x, после которого указывается число.

Например:

Замечание по двоичным и восьмеричным числам

Не так часто используются двоичные и восьмеричные числа, но они также поддерживаются 0b для двоичных и 0o для восьмеричных.

Короткий стиль записи двоичного числа:

Короткий стиль записи восьмеричного числа:

[свернуть]

Простые математические действия в JS

Перевод числа в строку (метод toString(base) )

Метод num.toString(base) возвращает строковое представление числа num в системе счисления base.

base может варьироваться от 2 до 36 (по умолчанию 10).

Часто используемые системы счисления:

  • base=16 — для шестнадцатеричного представления цвета, кодировки символов и т.д., цифры могут быть 0..9 или A..F;
  • base=2 — обычно используется для отладки побитовых операций, цифры 0 или 1;
  • base=36 — максимальное основание, цифры могут быть 0..9 или A..Z (т.е. используется весь латинский алфавит для представления числа).

36-разрядную систему счисления можно использовать для получения короткого представления большого числового идентификатора. К примеру, для создания короткой ссылки. Для этого просто преобразуем его в 36-разрядную систему счисления:

Внимание! Две точки в 123456..toString(36) это не опечатка. Если нам надо вызвать метод непосредственно на числе, как toString в примере выше, то нам надо поставить две точки .. после числа. Если мы поставим одну точку: 123456.toString(36), тогда это будет ошибкой, поскольку синтаксис JavaScript предполагает, что после первой точки начинается десятичная часть. А если поставить две точки, то JavaScript понимает, что десятичная часть отсутствует, и начинается метод.

Потеря точности при расчетах в JavaScript (неточные вычисления)

Внутри JavaScript число представлено в виде 64-битного формата IEEE-754. Для хранения числа используется 64 бита: 52 из них используется для хранения цифр, 11 из них для хранения положения десятичной точки (если число целое, то хранится 0), и один бит отведён на хранение знака.

Если число слишком большое, оно переполнит 64-битное хранилище, JavaScript вернёт бесконечность:

Наиболее часто встречающаяся ошибка при работе с числами в JavaScript – это потеря точности:

Подробнее о причинах

Число хранится в памяти в бинарной форме, как последовательность бит – единиц и нулей. Но дроби, такие как 0.1, 0.2, которые выглядят довольно просто в десятичной системе счисления, на самом деле являются бесконечной дробью в двоичной форме.

Другими словами, что такое 0.1? Это единица делённая на десять — 1/10, одна десятая. В десятичной системе счисления такие числа легко представимы, по сравнению с одной третьей: 1/3, которая становится бесконечной дробью 0.33333(3).

Деление на 10 гарантированно хорошо работает в десятичной системе, но деление на 3 – нет. По той же причине и в двоичной системе счисления, деление на 2 обязательно сработает, а 1/10 становится бесконечной дробью.

В JavaScript нет возможности для хранения точных значений 0.1 или 0.2, используя двоичную систему, точно также, как нет возможности хранить одну третью в десятичной системе счисления.

Числовой формат IEEE-754 решает эту проблему путём округления до ближайшего возможного числа. Правила округления обычно не позволяют нам увидеть эту «крошечную потерю точности», но она существует.

Ошибка в точности вычислений для чисел с плавающей точкой сохраняется в любом другом языке, где используется формат IEEE 754, включая PHP, Java, C, Perl, Ruby.

[свернуть]

Для устранения проблемы необходимо округлить результат вычислений, используя метод toFixed(n):

Метод умножения и последующего деления уменьшает погрешность, но полностью её не решает.

Проверка значений на тип number (isFinite и isNaN)

Числовые значения Infinity-Infinity) , а также NaN принадлежат типу number, но не являются «обычными» числами, поэтому в JS есть функции для их проверки:

  • isNaN(value) преобразует значение в число и проверяет является ли оно NaN;
  • isFinite(value) преобразует аргумент в число и возвращает true, если оно является обычным числом, т.е. не NaN/Infinity/-Infinity.

Иногда isFinite используется для проверки, содержится ли в строке число:

Помните, что пустая строка интерпретируется как 0 во всех числовых функциях, включая isFinite.

Сравнение Object.is

Существует специальный метод Object.is, который сравнивает значения примерно как ===, но более надёжен в двух особых ситуациях:

Явное преобразования чисел (функции parseInt(str, radix) и parseFloat)

Для явного преобразования к числу можно использовать унарный «+» или Number(). Если строка не является в точности числом, то результат будет NaN:

Единственное исключение — это пробелы в начале строки и в конце, они игнорируются.

Функции parseInt и parseFloat предназначены для получения числового значения из смешанных строк. Они «читают» число из строки и если в процессе чтения возникает ошибка, то возвращают полученное до ошибки число:

  • parseInt возвращает целое число,
  • parseFloat возвращает число с плавающей точкой.

Если значение параметра string не принадлежит строковому типу, оно преобразуется в него (с помощью абстрактной операции ToString).

Функции parseInt/parseFloat могут интерпретировать только начальную часть строки как численное значение; они вернут NaN, если не смогли прочитать в начале строки ни одну цифру:

Второй аргумент parseInt(str, radix)

Функция parseInt() имеет необязательный второй параметр, который определяет систему счисления, таким образом parseInt может также читать строки с шестнадцатеричными числами, двоичными числами и т.д.

Если основание системы счисления не определено или равно 0, предполагается, что оно равно 10, кроме случаев, когда число начинается с пар кодовых единиц 0x или 0X, и в этом случае предполагается, что основание системы счисления равно 16. Если система счисления равна 16, число может также необязательно начинаться с пар кодовых единиц 0x или 0X.

Другие математические функции JavaScript (объект Math)

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

Объект Math не является функциональным объектом. Math не работает с числами типа BigInt.

В отличие от других глобальных объектов, объект Math не является конструктором: все свойства и методы объекта Math являются статическими.

Вы ссылаетесь на константу π через Math.PI и вызываете функцию синуса через Math.sin(x), где x является аргументом метода. Константы в JavaScript определены с полной точностью действительных чисел.

Свойства объекта Math:

Методы объекта Math:

Подробнее об объекте Math, его свойствах и всех методах

Округление чисел в JavaScript (floor, ceil, round, trunc, toFixed)

Встроенные функции JavaScript для округления чисел до целого:

  1. Math.floor — округление в меньшую сторону.
  2. Math.ceil — округление в большую сторону.
  3. Math.round — округление до ближайшего целого.
  4. Math.trunc (не поддерживается в Internet Explorer) — удаление дробной части без округления.

Метод JavaScript toFixed(m) для округления чисел до заданной точности:

  • num.toFixed(m) — округляет значение до ближайшего числа (m — число знаков после запятой), как в большую, так и в меньшую сторону, аналогично методу Math.round. Результат возвращает в виде строки.

Если десятичная часть короче, чем необходимо, в конец строки будут добавлены нули:

Альтернативный метод округления

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

[свернуть]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.