Как сложить два числа в 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Разобранный пример
Что вынести из запуска:
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'?