Operações Básicas com Ponto Flutuante em Java

Em Java, entender como os tipos de ponto flutuante e as operações aritméticas funcionam é essencial para evitar erros comuns de precisão. Este guia aborda os aspectos fundamentais da divisão com decimais, as diferenças entre os tipos float e double, e métodos confiáveis para controlar a precisão decimal.

Comportamento do Operador /

Quando utilizado em Java, o operador / executa divisão padrão. Se pelo menos um dos operandso for do tipo float ou double, o resultado será um valor de ponto flutuante. Por exemplo, 7 / 2.0 resulta em 3.5. Para obter uma divisão inteira, que trunca a parte fracionária, ambos os operandos devem ser inteiros (ex: int, long), como em 7 / 2, que resulta em 3.

Escolhendo entre float e double

O Java oferece dois tipos primitivos de ponto flutuante:

  • float: Conhecido como precisão simples, ocupa 4 bytes de memória e oferece cerca de 7 dígitos decimais significativos. Deve ser declarado com o sufixo f ou F.
  • double: Conhecido como precisão dupla, ocupa 8 bytes e suporta aproximadamente 15 dígitos decimais significativos. É o tipo padrão para literais de ponto flutaunte.

A prática recomendada, salvo em cenários com restrições severas de memória (como processamento de grandes arrays em gráficos), é utilizar double devido à sua maior precisão. Usar um literal como 3.14 em um float sem o sufixo f causará um erro de compilação.

// Correto
double valorPrincipal = 10.5;
float valorReduzido = 10.5f;

// Incorreto, gera erro: "possible lossy conversion from double to float"
// float teste = 10.5;

Controlando a Precisão Decimal

Para limitar o número de casas decimais, a abordagem depende do objetivo: formatação para exibição ou arredondamento para cálculo.

Para Saída Formatada

Utilize System.out.printf() ou String.format() para definir o formato sem alterar o valor numérico original.

double valorPi = 3.14159265;

// Usando printf
System.out.printf("Valor com 2 casas: %.2f%n", valorPi);

// Usando String.format
String valorFormatado = String.format("Precisão de 4 casas: %.4f", valorPi);
System.out.println(valorFormatado);

Para Cálculos Precisos

Para operações financeiras ou que exigem arredondamento controlado, a classe BigDecimal é a ferramenta correta, pois evita erros de ponto flutuante inerentes aos tipos primitivos.

import java.math.BigDecimal;
import java.math.RoundingMode;

double entrada = 19.995;
BigDecimal decimal = new BigDecimal(Double.toString(entrada));
// Arredonda para 2 casas decimais usando a regra HALF_UP
BigDecimal resultado = decimal.setScale(2, RoundingMode.HALF_UP);
double valorFinal = resultado.doubleValue(); // Resultado: 20.00
System.out.println("Valor arredondado: " + valorFinal);

Erro Comum com System.out.println()

O método System.out.println() não aceita especificadores de formato como %.2f diretamente. Tentativas como System.out.println("%.2f", valor) resultam em erro de compilação porque println espera um único argumento. A solução é utilizar System.out.printf() para formatação direta ou primeiro gerar a string formatada.

double paraFormatar = 45.6789;

// Forma errada:
// System.out.println("%.2f", paraFormatar);

// Formas corretas:
System.out.printf("Usando printf: %.2f%n", paraFormatar);
System.out.println("Usando String.format: " + String.format("%.2f", paraFormatar));

Tags: java ponto flutuante double float BigDecimal

Publicado em 6-5 02:14 por Thomas