Negocio

Divisão inteira em Java: arredondamento e truncamento

Divisão Inteira

A divisão inteira em Java pode causar alguma frustração, mas se você sabe o que esperar ao entrar, pode tomar algumas medidas para aliviar esses empecilhos. Vamos começar examinando alguns códigos. O snippet a seguir é direto porque os inteiros se dividem uniformemente. Declaramos dois inteiros com valores e, a seguir, criamos outro para a divisão. Para dividir em Java, usamos a barra (/).

int a = 25; 
int b = 5;
int c = a / b;
System.out.println (c);

O que acontece se os números não dividirem uniformemente? E se você tentar dividir 10 por 3? O valor correto é 3,3333 ….. e assim por diante. Como as variáveis ​​são inteiras, Java não pode armazenar nenhum dos valores além do ponto decimal.

Se inserirmos 10 como numerador e 3 como divisor, Java apenas truncará:

Java trunca divisão

Faz sentido truncar 3,3 para 3; mas e se dividirmos 15 por 4? O resultado matemático seria 3,75. O Java arredondará para cima ou para baixo?

O código que você pode usar para aceitar a entrada do usuário e concluir o cálculo a seguir. Não vamos nos concentrar na mecânica disso, mas nas nuances da divisão inteira.

int a, b; 
Leia-me do sistema
System.out.println ("Digite o numerador");
a = readme.nextInt ();
System.out.println ("Digite o divisor");
b = readme.nextInt ();
System.out.println ("Resultado =" + a / b);

Quando executamos o código anterior e inserimos 15 para o numerador e 4 para o divisor, Java exibe a seguinte saída:

Java divide inteiros truncados

Se o Java estivesse arredondando o valor, o resultado seria 4. Em vez disso, ele simplesmente corta qualquer coisa à direita da vírgula decimal, deixando apenas o valor inteiro. De acordo com o funcionamento interno do Java, esse truncamento é realmente arredondado. Java se refere a isso como arredondamento para zero.

Mesmo que o valor seja truncado ou arredondado para zero, isso não significa que o valor foi perdido. O Java realmente pode dizer se há um resto de sua operação.

Divisão Módulo

Em nosso código, realizamos uma divisão simples (a / b). 15/4 era 3,75 e, como ambas as variáveis ​​eram inteiras, o Java eliminou os 0,75 e exibiu 3. No entanto, PODEMOS descobrir o que era o restante, se houver. Isso é feito com o operador de módulo (%).

Vamos experimentar. Após a divisão, adicionaremos uma linha para exibir a operação do módulo:

System.out.println ("Restante (se houver) =" + a% b); 
Depois de inserirmos 15 e 4 novamente, a seguinte saída é exibida:
O resto é 3. Se tivéssemos feito a matemática à mão, o resto teria sido 3 sobre 4, que é 0,75. Portanto, tecnicamente fomos capazes de obter a resposta completa da divisão de inteiros, embora o Java tenha cortado os valores após o ponto decimal. Um par de números dividido uniformemente exibiria zero para o restante.
Fundição de tipo
Pode parecer muito trabalhoso dividir e calcular o resto. Podemos forçar o resultado a ser uma fundição de tipo duplo; isto é, mudar de um tipo para outro. Vamos modificar nosso código um pouco e mudar o resultado para um double.
System.out.println ("Resultado =" (duplo) (a / b));
Quando executamos o programa, o resultado é:
Então, estamos de volta ao ponto de partida, exceto que tecnicamente temos um valor duplo (completo com o ponto decimal); mas Java truncado em vez de mostrar o valor real. Para obter um valor duplo, você terá que criar uma variável dupla e converter as variáveis ​​a e b em double. O código seria semelhante ao seguinte:
double c = ((double) a / (double) b);
Dadas as entradas de 15 e 4 mais uma vez, a saída será o valor correto:
Agora temos o valor real! No entanto, é necessário que realmente armazenemos o valor em um tipo de dados duplo. Novamente, se estivéssemos trabalhando apenas com inteiros, o valor sempre ficaria truncado.
Resumo da lição
Quando você divide inteiros em Java, o resultado é truncado. Podemos encontrar um resto usando o operador de módulo (%) em nosso código. Isso nos dirá o resto; entretanto, isso não tira o fato de que o Java não arredondará o valor. Ele apenas trunca, arredondando para baixo em direção a zero. Se quisermos ver o valor real, teríamos que usar a conversão de tipo - mudando de um tipo para outro - para converter para um double ou float para obter a precisão.