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.