W3docs

Как сложить два числа в Java

Сложение двух чисел в Java с помощью int, long, double и BigDecimal, включая ввод, введённый пользователем.

Как сложить два числа в Java

Сложение двух чисел — первая арифметика, которую большинство пишет в Java, но «правильный» способ зависит от того, откуда берутся числа и насколько большими они могут стать. Эта глава охватывает идиоматичные подходы: математику с литералами int, разбор значений из текста, сложение с плавающей точкой и безопасное сложение без тихого переполнения.

Сложение двух значений int

Простейший случай — сложение двух переменных int оператором +. Результат сам является int.

int a = 7;
int b = 5;
int sum = a + b;
System.out.println(sum); // 12

Это повседневный случай и тот, что вы будете писать чаще всего. Единственное, за чем нужно следить, — диапазон int: он хранит значения от -2 147 483 648 до 2 147 483 647. Сложите за этим пределом, и значение тихо «завернётся», вместо того чтобы выбросить исключение — об этом ниже.

Сложение чисел, разобранных из текста

Когда числа приходят как строки — из консольного ввода, файла или HTTP-запроса, — перед сложением их нужно преобразовать. Используйте Integer.parseInt для целых чисел или Double.parseDouble для дробных.

String first = "42";
String second = "58";
int sum = Integer.parseInt(first) + Integer.parseInt(second);
System.out.println(sum); // 100

Частая ошибка новичков — применять + прямо к строкам: "42" + "58" даёт "4258", потому что + конкатенирует строки, а не складывает их. Сначала разберите, потом складывайте. Если текст не является допустимым числом, parseInt выбрасывает NumberFormatException, поэтому проверяйте ввод или оборачивайте вызов в try/catch, когда ввод не вызывает доверия.

Сложение дробных чисел и обработка переполнения

Для дробных значений складывайте операнды double (или float). Учтите, что двоичная плавающая точка не может точно представить каждое десятичное число, так что 0.1 + 0.2 — это 0.30000000000000004, а не 0.3. Для денег используйте вместо этого BigDecimal.

Для целых чисел, которые могут превысить диапазон int, расширьте один операнд до long или используйте Math.addExact, чтобы превратить переполнение в исключение, а не в неправильный ответ.

ПодходПоведение при переполненииИспользовать когда
int + intТихо заворачиваетсяЗначения уверенно в диапазоне int
(long) a + bВычисляет в 64 битах, без заворотаСумма может превысить int, но помещается в long
Math.addExact(a, b)Выбрасывает ArithmeticExceptionНужно обнаружить переполнение, а не поглотить его
BigInteger / BigDecimalПроизвольная точностьЗначения могут быть сколь угодно велики или нужны точные десятичные
int big = Integer.MAX_VALUE;
System.out.println(big + 1);               // -2147483648 (wrapped!)
System.out.println((long) big + 1);        // 2147483648 (correct)
System.out.println(Math.addExact(big, 1)); // throws ArithmeticException

Разобранный пример

java— editable, runs on the server

Что вынести из запуска:

  • int sum: 12 показывает обычный оператор +, складывающий два значения int напрямую — повседневный случай.
  • parsed sum: 100 подтверждает, что Integer.parseInt превращает "42" и "58" в числа перед сложением, а не конкатенирует их в "4258".
  • double sum: 0.30000000000000004 — это ошибка представления с плавающей точкой от 0.1 + 0.2 — доказательство того, что double не точен для десятичных, поэтому обращайтесь к BigDecimal, когда важна точность.
  • int overflow: -2147483648 показывает, как Integer.MAX_VALUE + 1 тихо заворачивается к самому отрицательному int, тогда как long safe: 2147483648 даёт правильный ответ за счёт расширения одного операнда до long.
  • addExact: overflow detected подтверждает, что Math.addExact при том же переполнении выбрасывает ArithmeticException вместо возврата неправильного значения.

Practice

Практика

Why does Integer.parseInt('42') + Integer.parseInt('58') give 100 while '42' + '58' gives '4258'?