HOWTO · Java
Como obter resultados fracionários em divisões no Java
Entenda por que a divisão inteira em Java descarta a parte fracionária e como obter um quociente de ponto flutuante com conversões ou operandos de tipos diferentes.
Nesta página
Para obter um quociente fracionário em Java, transforme pelo menos um dos operandos em um valor de ponto flutuante antes da operação /. A divisão entre dois valores int é uma divisão inteira e descarta a parte fracionária; atribuir esse resultado a um double depois não recupera a fração perdida. Basta converter um dos operandos com (double) antes da divisão: Java promove o outro operando para essa operação sem alterar a variável correspondente.
Entendendo a divisão inteira em Java
Quando os dois operandos são de tipos inteiros, Java realiza uma divisão inteira. O quociente é arredondado em direção a zero: 30 / 8 resulta em 3, e não em 3.75. Isso acontece na própria expressão, antes da atribuição ou da impressão do resultado. Use a divisão inteira quando não precisar da parte fracionária, por exemplo, ao calcular uma quantidade expressa em números inteiros.
Obtendo um resultado double a partir de operandos inteiros
Converta um dos operandos antes de / para que a divisão seja de ponto flutuante. A conversão altera o tipo da expressão desse operando; em seguida, a promoção numérica binária converte o outro operando para essa operação. A variável original do tipo int continua sendo int.
Execute este exemplo completo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
public class DivisionExample {
public static void main(String[] args) {
int numerator = 30;
int denominator = 8;
double quotient = (double) numerator / denominator;
System.out.println("Integer division: " + (numerator / denominator));
System.out.println("Cast before division: " + quotient);
System.out.println("Mixed operands: " + (numerator / 8.0));
System.out.println("Variable type remains int: " + (numerator));
}
}
Integer division: 3
Cast before division: 3.75
Mixed operands: 3.75
Variable type remains int: 30
A primeira linha usa divisão inteira. Converter um operando antes de / e usar o literal 8.0 produzem resultados fracionários; numerator continua sendo int. Os rótulos e as linhas de saída do exemplo permanecem em inglês.
Dividindo valores de tipos numéricos diferentes
Se um operando for double e o outro, int, Java promove o operando int para double durante a divisão, e a expressão tem tipo double. Por exemplo, 30 / 8.0 resulta em 3.75; o valor 30 continua sendo inteiro na variável original. Um operando float também faz com que a operação use ponto flutuante, mas o tipo do resultado depende da promoção numérica binária: com operandos float e int, o resultado é float; combinando float e double, o resultado é double.
Erros comuns em divisões
- Converter depois da divisão é tarde demais.
(double) (30 / 8)converte o3inteiro já calculado e resulta em3.0. Converta antes:(double) 30 / 8. - O tipo da variável que recebe o resultado não determina a operação.
double quotient = 30 / 8;ainda realiza primeiro uma divisão inteira, entãoquotientrecebe3.0. - Escolha
floatoudoublede propósito.doubletem mais precisão quefloat; ambos usam ponto flutuante binário e podem representar algumas frações decimais apenas de forma aproximada. Para exibir um valor com várias casas decimais, formate-o na apresentação. - O comportamento da divisão por zero depende dos tipos dos operandos. A divisão inteira por zero lança
ArithmeticException. Na divisão de ponto flutuante, aplica-se o IEEE 754: um valor diferente de zero dividido por0.0resulta em infinito, enquanto0.0 / 0.0resulta emNaN.
Perguntas frequentes
O que Java retorna ao dividir dois valores int?
A expressão de divisão tem resultado inteiro, e qualquer parte fracionária é descartada pelo arredondamento em direção a zero. Por exemplo, 30 / 8 resulta em 3.
Como obtenho um resultado double a partir de valores inteiros?
Converta um operando antes da divisão, como em (double) numerator / denominator, ou use um literal de ponto flutuante em um dos operandos.
Posso dividir um int por um double?
Sim. Java promove o int para essa operação, e o resultado da expressão é double; o tipo declarado da variável original não muda.
Qual é a diferença entre float e double?
float é um tipo binário de ponto flutuante IEEE 754 de 32 bits, enquanto double tem 64 bits. Em geral, double oferece mais precisão e alcance, mas nenhum dos dois representa exatamente todas as frações decimais.