Como arredondar um número para N casas decimais em Java? Análise completa com exemplos
Arredondar números é uma daquelas tarefas que todo desenvolvedor Java enfrenta, seja um iniciante exibindo preços no console ou um engenheiro experiente trabalhando com cálculos financeiros. Parece simples, não é? Mas na prática, o arredondamento double em Java esconde várias armadilhas: desde erros "mágicos" de precisão até a escolha da ferramenta certa para cada tarefa.
Neste artigo, vamos analisar todas as principais formas de arredondar um número em Java para um número específico de casas decimais. Você aprenderá quando usar Math.round, por que o Double é perigoso em cálculos financeiros e por que o BigDecimal é seu melhor amigo quando se trata de dinheiro. Vamos lá!
O problema: por que o arredondamento simples em Java nem sempre é simples?
Antes de vermos as soluções, vamos entender a raiz do problema. O tipo double em Java (como na maioria das linguagens) armazena números de ponto flutuante em formato binário. Por isso, muitas frações decimais (como 0.1 ou 0.2) não podem ser representadas com exatidão. Tente executar:
System.out.println(0.1 + 0.2); // Exibe 0.30000000000000004Para exibição na tela, isso pode não ser crítico, mas para cálculos é um desastre. Portanto, o arredondamento Java para 2 casas (ou qualquer outra quantidade) deve ser feito de forma consciente.
Método 1: Arredondamento matemático com Math.round
A forma mais direta é usar Math.round(). Ele arredonda o número para o inteiro mais próximo. Para obter N casas, "deslocamos" a vírgula decimal, arredondamos e depois deslocamos de volta.
Exemplo: arredondar double para 2 casas decimais:
public static double roundWithMathRound(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale;}
// Usodouble number = 3.14159265;double rounded = roundWithMathRound(number, 2);System.out.println(rounded); // 3.14Vantagens: Simplicidade, sem dependência de bibliotecas externas.
Desvantagens: Funciona com double, portanto ainda sujeito a erros de precisão em valores limite. Não é adequado para finanças.
Método 2: Formatação com DecimalFormat
A classe DecimalFormat do pacote java.text permite não apenas arredondar, mas também formatar o número como string de forma elegante. É ideal para interfaces de usuário e relatórios.
import java.text.DecimalFormat;
public static String formatWithDecimalFormat(double value, int places) { // Cria o padrão: #.00 para duas casas StringBuilder pattern = new StringBuilder("#."); for (int i = 0; i < places; i++) { pattern.append("0"); } DecimalFormat df = new DecimalFormat(pattern.toString()); return df.format(value);}
// UsoString result = formatWithDecimalFormat(2.71828, 3);System.out.println(result); // 2.718Você também pode configurar o modo de arredondamento (RoundingMode):
df.setRoundingMode(RoundingMode.HALF_UP); // Arredondamento matemático padrãoImportante: DecimalFormat retorna uma String, não um número. Se você precisar de um double para cálculos posteriores, este método não é adequado.
Método 3: BigDecimal — o padrão ouro de precisão
Quando a precisão é crítica (finanças, cálculos científicos), o BigDecimal entra em cena. Ele permite controlar cada dígito e evitar imprecisões do double.
import java.math.BigDecimal;import java.math.RoundingMode;
public static BigDecimal roundWithBigDecimal(double value, int places) {\