Como Somar Dois Números em Java
Some dois números em Java com int, long, double e BigDecimal, incluindo entrada fornecida pelo usuário.
Somar dois números é a primeira aritmética que a maioria das pessoas escreve em Java, mas a forma "correta" depende de onde os números vêm e quão grandes podem ser. Este capítulo aborda as abordagens idiomáticas: matemática com int literal, análise de valores de texto, adição de ponto flutuante e adição segura sem overflow silencioso.
Somando dois valores int
O caso mais simples é somar duas variáveis int com o operador +, um dos operadores aritméticos do Java. O resultado é um int.
int a = 7;
int b = 5;
int sum = a + b;
System.out.println(sum); // 12Este é o caso do dia a dia e o que você mais irá escrever. A única coisa a observar é o intervalo de int: ele armazena valores de -2.147.483.648 a 2.147.483.647. Somar além desse limite faz o valor dar a volta silenciosamente em vez de lançar uma exceção — abordado abaixo.
Somando números analisados a partir de texto
Quando os números chegam como strings — de entrada no console, de um arquivo ou de uma requisição HTTP — você deve convertê-los antes de somar. Use Integer.parseInt para números inteiros ou Double.parseDouble para decimais.
String first = "42";
String second = "58";
int sum = Integer.parseInt(first) + Integer.parseInt(second);
System.out.println(sum); // 100Um erro comum de iniciantes é usar + diretamente nas strings: "42" + "58" produz "4258" porque + concatena strings em vez de somá-las. Converta primeiro, depois some. Se o texto não for um número válido, parseInt lança NumberFormatException, então valide ou envolva a chamada em um try/catch quando a entrada não for confiável.
Somando decimais e tratando overflow
Para valores decimais, some operandos double (ou float). Esteja ciente de que o ponto flutuante binário não pode representar todos os decimais com exatidão, então 0.1 + 0.2 resulta em 0.30000000000000004, não 0.3. Para valores monetários, use BigDecimal.
Para números inteiros que podem exceder o intervalo de int, amplie um operando para long, ou use Math.addExact para transformar o overflow em uma exceção em vez de uma resposta errada. Escolher o tipo numérico correto desde o início é a defesa mais limpa — veja tipos de dados Java para o intervalo de cada tipo.
| Abordagem | Comportamento no overflow | Use quando |
|---|---|---|
int + int | Dá a volta silenciosamente | Valores confortavelmente dentro do intervalo de int |
(long) a + b | Computa em 64 bits, sem volta | A soma pode exceder int mas cabe em long |
Math.addExact(a, b) | Lança ArithmeticException | Você deve detectar overflow, não absorvê-lo |
BigInteger / BigDecimal | Precisão arbitrária | Valores podem ser arbitrariamente grandes ou precisam de decimais exatos |
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 ArithmeticExceptionSomando dois números digitados pelo usuário
Em um programa real, os operandos frequentemente vêm do teclado. Um Scanner lê cada linha e a converte para um número em uma única etapa com nextInt (ou nextDouble para decimais), então você não precisa chamar parseInt manualmente.
import java.util.Scanner;
public class AddInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter first number: ");
int a = scanner.nextInt();
System.out.print("Enter second number: ");
int b = scanner.nextInt();
System.out.println("Sum: " + (a + b));
}
}Se o usuário digitar algo que não seja um inteiro, nextInt lança InputMismatchException. Proteja-se com hasNextInt() ou um try/catch quando a entrada não for confiável.
Um exemplo prático
O que observar na execução:
int sum: 12mostra o operador+simples somando dois valoresintdiretamente — o caso do dia a dia.parsed sum: 100confirma queInteger.parseIntconverte"42"e"58"em números antes de somar, em vez de concatená-los em"4258".double sum: 0.30000000000000004é o erro de representação de ponto flutuante de0.1 + 0.2— prova de quedoublenão é exato para decimais, então useBigDecimalquando a precisão for importante.int overflow: -2147483648mostraInteger.MAX_VALUE + 1dando a volta silenciosamente para ointmais negativo, enquantolong safe: 2147483648dá a resposta correta ao ampliar um operando paralong.addExact: overflow detectedconfirma queMath.addExactlançaArithmeticExceptionno mesmo overflow em vez de retornar um valor incorreto.