1. Введение
Все числа в JavaScript, как целые так и дробные, имеют тип Number и записывать
их можно не только в десятичной системе счисления.
2. Приведение к числу
Большинство арифметических операций и математических функций преобразуют
значение в число автоматически. Для того чтобы сделать это явно, используйте
функцию Number(val), передавая ей в val то, что надо привести к числу.
Если значние не возможно привести к числу, результатом будет специальное
значение NaN (Not a Number). Аналогичным образом происходит преобразование и в
других математических операторах и функциях.
const valueA = '5';
console.log(Number(valueA)); // 5
console.log(typeof Number(valueA)); // 'number'
const valueB = 'random string';
console.log(Number(valueB)); // NaN
console.log(typeof Number(valueB)); // 'number'
3. Number.parseInt() и Number.parseFloat()
Методы преобразуют строку символ за символом, пока это возможно. При возникновении ошибки возвращается число, которое получилось.
// Парсит из строки целое число
console.log(Number.parseInt('5px')); // 5
console.log(Number.parseInt('12qwe74')); // 12
console.log(Number.parseInt('12.46qwe79')); // 12
console.log(Number.parseInt('qweqwe')); // NaN
// Парсит из строки дробное число
console.log(Number.parseFloat('5px')); // 5
console.log(Number.parseFloat('12qwe74')); // 12
console.log(Number.parseFloat('12.46qwe79')); // 12.46
console.log(Number.parseFloat('qweqwe')); // NaN
4. Проверка на число
Для проверки на число можно использовать метод Number.isNaN(val). Он
проверяет, является ли указанное значение NaN или нет. Этот метод отвечает на
вопрос "Это Not A Number?" и возвращает:
true— если значениеvalэтоNaNfalse— если значениеvalэто неNaN
Для всех значений val кроме NaN, при передаче в Number.isNaN(val) вернёт
false. Этот метод не производит попытку преобразовать val к числу, а просто
выполняет проверку на NaN.
const validNumber = Number('51'); // 51
console.log(Number.isNaN(validNumber)); // false
const invalidNumber = Number('qweqwe'); // NaN
console.log(Number.isNaN(invalidNumber)); // true
5. Сложение чисел с плавающей точкой
При сложении не целых чисел в JavaScript, и других языках программирования, есть
особенность. Если кратко, то 0.1 + 0.2 не равно 0.3, результат сложения
больше чем 0.3. Все от того что машина считает в двоичной системе.
Число 0.1 в двоичной системе счисления - это бесконечная дробь, так как
единица на десять в двоичной системе не делится. Также бесконечной дробью
является 0.2. Двоичное значение бесконечных дробей хранится только до
определенного знака, поэтому возникает неточность. При сложении 0.1 и 0.2,
две неточности складываются, получается незначительная, но всё же ошибка в
вычислениях.
console.log(0.1 + 0.2 === 0.3); // false
console.log(0.1 + 0.2); // 0.30000000000000004
Конечно, это не означает, что точные вычисления для таких чисел невозможны. Есть несколько методов решения этой проблемы:
- Сделать их целыми, умножив на 10, сложить, а потом результат разделить на 10
- Сложить, а затем округлить до разумного знака после запятой. Округления до 10-го знака обычно бывает достаточно, чтобы отсечь ошибку вычислений
// Сделать их целыми, умножив на 10, сложить, а результат разделить на 10
console.log((0.1 * 10 + 0.2 * 10) / 10);
6. Объект Math
Один из встроенных объектов в язык. Предоставляет набор методов для работы с числами. Знание всех методов наизусть не требуется, только некоторых, наиболее полезных.
// Math.floor(num) - возвращает наибольшее целое число, меньшее, либо равное указанному
console.log(Math.floor(1.7)); // 1
// Math.ceil(num) - возвращает наименьшее целое число,
// большее, либо равное указанному числу.
console.log(Math.ceil(1.2)); // 2
// Math.round(num) - возвращает значение числа, округлённое до ближайшего целого
console.log(Math.round(1.2)); // 1
console.log(Math.round(1.5)); // 2
// Math.max(num1, num2, ...) - возвращает наибольшее число из набора
console.log(Math.max(20, 10, 50, 40)); // 50
// Math.min(num1, num2, ...) - возвращает наименьшее число из набора
console.log(Math.min(20, 10, 50, 40)); // 10
// Math.pow(base, exponent) - возведение в степень
console.log(Math.pow(2, 4)); // 16
// Math.random() - возвращает псевдослучайное число в диапазоне [0, 1)
console.log(Math.random()); // случайное число между 0 и 1
console.log(Math.random() * (10 - 1) + 1); // случайное число от 1 до 10