JavaScript WindowsLinuxmacOS

JavaScript: число из input преобразуется в строку и ломает сумму

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Сложение чисел из полей input даёт «23» вместо 5: проверьте строковый тип .value, корректность десятичной записи и преобразуйте значения до вычислений.

В этой статье
  1. Что происходит и как распознать неисправность
  2. Как отличить причины
  3. Пошаговая диагностика и исправление
  4. Команды и примеры для проверки
  5. Как проверить результат и что делать дальше

#Что происходит и как распознать неисправность

Значение input.value в браузере — строка, даже если элемент имеет type="number". Оператор + при наличии строки может выполнить объединение текста. Например, "2" + "3" даёт "23", а не число 5.

#Как отличить причины

Возможная причинаКак узнатьЧто делать
Значения не преобразованыИспользуется a.value + b.value.Результат выглядит как склеенные числа.Преобразуйте входные данные через Number/valueAsNumber.
Пустая строка трактуется как нольNumber("") возвращает 0, что может маскировать отсутствие ввода.Пустое поле всё равно участвует в вычислении.Проверяйте пустоту отдельно от числа 0.
Разделитель и нечисловые символыПри вводе 1,5 Number возвращает NaN.Результат NaN или неправильное число.Согласуйте формат, отклоняйте неподходящие значения.

#Пошаговая диагностика и исправление

  1. Откройте страницу и найдите строку расчётаЗапустите проблемную форму, нажмите F12 → «Консоль», затем воспроизведите 2 + 3. В редакторе найдите обработчик кнопки «Посчитать» и выражение с input.value. Сохраните его копию перед изменением. Если расчёт выполняется на сервере, сначала выясните, где именно строка превращается в число.
  2. Проверьте тип и реальный текст полейВ обработчике временно выполните console.log(typeof a.value, a.value, typeof b.value, b.value) для своих переменных. В консоли будет string, даже у input type=number. Если a или b — не элементы формы, найдите фактические DOM-узлы по правильным id.
  3. Проверяйте обязательность заполнения до преобразованияПеред вычислением убедитесь, что a.value.trim() и b.value.trim() не пусты. Если поле пустое, покажите сообщение пользователю и не рассчитывайте результат. Это важно, потому что Number("") даёт 0, а пустое значение может означать ошибку ввода.
  4. Преобразуйте с проверкой конечного числаДля простого ввода в согласованном формате используйте const x = Number(a.value); const y = Number(b.value); далее Number.isFinite(x) и аналогично для y. Для type="number" доступен valueAsNumber, но при пустом или неверном значении результат NaN. Не используйте parseInt для дробных денег: он обрежет часть числа.
  5. Разберите десятичный разделитель по правилам формыЕсли пользователи вводят запятую, выберите явную политику: сообщение «используйте точку» либо безопасное преобразование только допустимых форматов после проверки. Слепая замена всех запятых может испортить значения с разделителями тысяч. Установите корректные step, min, max и проверяйте input.validity при необходимости.
  6. Проверьте операции плюс, минус и дробиВ браузере испытайте 2+3=5, 2.5+0.5=3, 0+0=0, пустое поле и текст вместо числа. Убедитесь, что результаты ожидаемые; отдельно определите правила округления для денег, так как обычная арифметика двоичных дробей может дать 0.30000000000000004.
  7. Уберите диагностический код и исправьте сообщение ошибкиПосле проверки удалите временный вывод значений. Если ошибка осталась, проверьте, не конкатенирует ли строки шаблон до преобразования или результат сериализации. При регрессии восстановите первоначальный обработчик и напишите небольшой тест для этой формы.

#Команды и примеры для проверки

Текст
Создайте в HTML поля с id a и b; код запускайте в обработчике расчёта. Для пустых полей в интерфейсе лучше показывать сообщение, а не выбрасывать исключение.
const a = document.querySelector("#a");
const b = document.querySelector("#b");
if (!a || !b) throw new Error("Поля #a и #b не найдены");
if (a.value.trim() === "" || b.value.trim() === "") {
  throw new Error("Заполните оба поля");
}
const x = Number(a.value);
const y = Number(b.value);
if (!Number.isFinite(x) || !Number.isFinite(y)) {
  throw new Error("Введите числа в допустимом формате");
}
console.log(x + y);

#Как проверить результат и что делать дальше

Вместо склеенного текста форма возвращает сумму двух чисел, а некорректный ввод обнаруживается до вычисления. Для денежных расчётов нужна отдельная логика точной десятичной арифметики.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.