Number
Number
Технический фундамент числовой надежности
Числа в продуктовых сценариях требуют дисциплины, потому что у number есть особенности:
- все обычные числа в JS это IEEE 754 (возможны погрешности float-арифметики);
- вход из формы/API часто приходит строкой и требует явного преобразования;
NaNиInfinityнужно проверять отдельно, чтобы не ломать бизнес-правила;- сравнение дробных чисел иногда нужно делать через допуск (tolerance), а не через
===.
Числа в прикладном коде должны быть не только посчитаны, но и валидированы.
Почему с числами в JavaScript нужно быть внимательным
Тип number используется для целых и дробных значений. Это удобно, но у такого универсального подхода есть нюансы: точность с плавающей точкой, NaN, Infinity, приведение строк к числам.
Ключевой момент: в JavaScript все обычные числа - это один тип number с ограничениями IEEE 754.
Проверь себя: почему выражение 0.1 + 0.2 не всегда равно 0.3 буквально?
Если нужно сравнить дробные значения, часто используют допуск:
const sum = 0.1 + 0.2;
const isSame = Math.abs(sum - 0.3) < Number.EPSILON;
console.log(isSame); // true
Базовая работа с number
const price = 199.99;
const quantity = 2;
const total = price * quantity;
console.log(total); // 399.98
Основные операции привычны: +, -, *, /, %, **.
Смотри, что важно: результат может быть дробным даже там, где "математически ожидаешь" целое.
Приведение к числу
Часто вход приходит строкой (из формы/API).
const rawAge = '18';
const age = Number(rawAge);
console.log(age); // 18
console.log(typeof age); // number
Если вход некорректный, получишь NaN.
const value = Number('abc');
console.log(value); // NaN
Проверять нужно через Number.isNaN(value).
NaN и Infinity
NaN- результат некорректной числовой операции;Infinity/-Infinity- бесконечности (например, деление на ноль).
console.log(10 / 0); // Infinity
console.log(Number('x')); // NaN
Здесь часто путаются: NaN !== NaN, поэтому обычное === для проверки не подходит.
Анти-провал: если тебе важно, что значение конечное число (не NaN, не Infinity), используй Number.isFinite.
console.log(Number.isFinite(10 / 0)); // false
console.log(Number.isFinite(10)); // true
Проверь себя: почему Number.isNaN() надежнее, чем сравнение с NaN?
Округление и формат
Для интерфейса часто нужно округлять значения.
const value = 12.345;
console.log(value.toFixed(2)); // '12.35' (строка)
console.log(Math.round(value)); // 12
Смотри, что важно: toFixed возвращает строку, а не number.
Number vs parseInt/parseFloat
Иногда вход содержит «мусорные» символы (например, px).
console.log(Number('10px')); // NaN
console.log(parseInt('10px', 10)); // 10
console.log(parseFloat('10.5px')); // 10.5
Смотри, что важно: Number(...) требует, чтобы строка целиком была числом, а parseInt/parseFloat читают число с начала строки. Для parseInt почти всегда указывай основание системы счисления (radix).
Мини-сценарий: расчет скидки
const rawPrice = '1500';
const discountPercent = 10;
const price = Number(rawPrice);
if (Number.isNaN(price)) {
console.log('Некорректная цена');
} else {
const finalPrice = price - (price * discountPercent) / 100;
console.log(finalPrice);
}
Это типичный сценарий магазина: вход строкой, валидация, вычисление, вывод.
Частые ошибки новичков
- Не проверять
NaNпосле преобразования. - Путать строковое и числовое сложение (
'10' + 5). - Сравнивать дробные числа напрямую без допуска по погрешности.
- Забывать, что
toFixedвозвращает строку.
Анти-провал: перед арифметикой проверяй, что вход действительно number и не NaN.
Что будет, если изменить входные данные
Если rawPrice = '1500', расчет пройдет корректно. Если rawPrice = '', Number('') даст 0, что может быть логически неверно для бизнеса. Если rawPrice = 'abc', будет NaN. Значит, кроме преобразования нужна бизнес-валидация диапазона.
Проверь себя: почему Number('') === 0 может привести к скрытой ошибке в форме оплаты?
Краткий итог
numberв JS покрывает и целые, и дробные значения.- Важно учитывать
NaN,Infinityи погрешности float-арифметики. - Преобразование строк в числа требует проверок (
Number.isNaN). - Методы форматирования могут менять тип результата (
toFixed-> string). - Надежная работа с числами = явная валидация + контроль edge case.