Introdução
Neste laboratório, você aprenderá como verificar se um número é zero em Java. Essa habilidade fundamental é crucial para controlar o fluxo do programa usando instruções condicionais. Começaremos explorando o uso do operador de igualdade (==) para comparar valores inteiros a zero.
Em seguida, abordaremos as considerações específicas e as possíveis armadilhas ao lidar com números de ponto flutuante e zero devido a problemas de precisão. Finalmente, examinaremos como realizar verificações de zero ao trabalhar com as classes wrapper do Java para tipos primitivos.
Usar o Operador de Igualdade para Zero
Nesta etapa, exploraremos como verificar se um número é igual a zero em Java usando o operador de igualdade. Esta é uma operação fundamental na programação, frequentemente usada em instruções condicionais para controlar o fluxo do seu programa.
Em Java, o operador de igualdade é representado por ==. Ele é usado para comparar dois valores e retorna true se eles forem iguais e false caso contrário.
Vamos criar um programa Java simples para demonstrar isso.
Abra o arquivo
HelloJava.javano editor WebIDE, caso ele ainda não esteja aberto.Substitua todo o conteúdo do arquivo pelo seguinte código:
public class HelloJava { public static void main(String[] args) { int number = 0; if (number == 0) { System.out.println("The number is zero."); } else { System.out.println("The number is not zero."); } } }Vamos analisar este novo código:
int number = 0;: Esta linha declara uma variável inteira chamadanumbere a inicializa com o valor0.if (number == 0): Esta é uma instruçãoif, que é usada para tomar decisões no seu código. A condição dentro dos parênteses(number == 0)verifica se o valor da variávelnumberé igual a0.System.out.println("The number is zero.");: Esta linha será executada somente se a condiçãonumber == 0fortrue.else: Esta palavra-chave introduz o bloco de código que será executado se a condiçãoifforfalse.System.out.println("The number is not zero.");: Esta linha será executada somente se a condiçãonumber == 0forfalse.
Salve o arquivo (Ctrl+S ou Cmd+S).
Agora, vamos compilar nosso programa modificado. No Terminal, certifique-se de estar no diretório
~/project. Você pode usarcd ~/projectse necessário. Em seguida, execute:javac HelloJava.javaSe a compilação for bem-sucedida, você não verá nenhuma saída.
Finalmente, vamos executar nosso programa:
java HelloJavaVocê deve ver a seguinte saída:
The number is zero.Isso confirma que nosso programa verificou corretamente se a variável
numberera igual a zero usando o operador==.
Agora, tente alterar o valor da variável number para um valor diferente de zero (por exemplo, int number = 5;), salve o arquivo, recompilar e execute o programa novamente para ver a saída diferente.
Lidar com a Precisão de Ponto Flutuante
Nesta etapa, exploraremos um problema comum ao trabalhar com números de ponto flutuante (números com casas decimais) na programação: precisão. Devido à forma como os computadores armazenam esses números, comparações diretas de igualdade usando == podem, às vezes, levar a resultados inesperados.
Vamos ver isso em ação.
Abra o arquivo
HelloJava.javano editor WebIDE.Substitua o código existente pelo seguinte:
public class HelloJava { public static void main(String[] args) { double num1 = 0.1 + 0.2; double num2 = 0.3; System.out.println("num1: " + num1); System.out.println("num2: " + num2); if (num1 == num2) { System.out.println("num1 is equal to num2."); } else { System.out.println("num1 is not equal to num2."); } } }Neste código:
- Declaramos duas variáveis
double,num1enum2.doubleé um tipo de dado em Java usado para armazenar números de ponto flutuante. - Atribuímos
0.1 + 0.2anum1e0.3anum2. Matematicamente, esses valores deveriam ser iguais. - Imprimimos os valores de
num1enum2para ver sua representação exata. - Usamos o operador
==para verificar senum1é igual anum2.
- Declaramos duas variáveis
Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa no Terminal:
javac HelloJava.javaExecute o programa compilado:
java HelloJavaVocê pode se surpreender com a saída:
num1: 0.30000000000000004 num2: 0.3 num1 is not equal to num2.Como você pode ver,
num1não é exatamente0.3devido à forma como os números de ponto flutuante são armazenados. Este é um problema comum e é por isso que a comparação direta de números de ponto flutuante para igualdade usando==é geralmente desencorajada.
Para lidar com isso, em vez de verificar a igualdade exata, geralmente verificamos se a diferença absoluta entre os dois números está dentro de uma tolerância muito pequena (frequentemente chamada de "épsilon").
Vamos modificar o código para usar essa abordagem.
Abra
HelloJava.javanovamente.Substitua a instrução
ifpelo seguinte:double epsilon = 0.000001; // A small tolerance if (Math.abs(num1 - num2) < epsilon) { System.out.println("num1 is approximately equal to num2."); } else { System.out.println("num1 is not approximately equal to num2."); }Aqui:
- Definimos um pequeno valor
epsilon. Math.abs(num1 - num2)calcula a diferença absoluta entrenum1enum2.- Verificamos se essa diferença absoluta é menor que nosso
epsilon.
- Definimos um pequeno valor
Salve o arquivo.
Compile o programa:
javac HelloJava.javaExecute o programa:
java HelloJavaAgora a saída deve ser:
num1: 0.30000000000000004 num2: 0.3 num1 is approximately equal to num2.Isso demonstra a maneira correta de comparar números de ponto flutuante para igualdade prática, considerando as limitações de precisão.
Testar com Classes Wrapper
Nesta etapa, exploraremos como a igualdade funciona com as classes wrapper do Java. Classes wrapper são classes especiais que fornecem uma maneira de usar tipos de dados primitivos (como int, double, boolean) como objetos. Por exemplo, a classe wrapper para int é Integer, e para double é Double.
Ao comparar objetos em Java, o operador == verifica se as duas variáveis se referem ao exato mesmo objeto na memória, não se seus valores são iguais. Para comparar os valores dos objetos, você deve usar o método equals().
Vamos ver como isso se aplica às classes wrapper.
Abra o arquivo
HelloJava.javano editor WebIDE.Substitua o código existente pelo seguinte:
public class HelloJava { public static void main(String[] args) { Integer intObj1 = new Integer(100); Integer intObj2 = new Integer(100); Integer intObj3 = intObj1; // intObj3 refers to the same object as intObj1 System.out.println("Comparing Integer objects with ==:"); if (intObj1 == intObj2) { System.out.println("intObj1 == intObj2 is true"); } else { System.out.println("intObj1 == intObj2 is false"); } if (intObj1 == intObj3) { System.out.println("intObj1 == intObj3 is true"); } else { System.out.println("intObj1 == intObj3 is false"); } System.out.println("\nComparing Integer objects with equals():"); if (intObj1.equals(intObj2)) { System.out.println("intObj1.equals(intObj2) is true"); } else { System.out.println("intObj1.equals(intObj2) is false"); } if (intObj1.equals(intObj3)) { System.out.println("intObj1.equals(intObj3) is true"); } else { System.out.println("intObj1.equals(intObj3) is false"); } } }Neste código:
- Criamos dois objetos
Integer,intObj1eintObj2, com o mesmo valor (100) usandonew Integer(). Isso cria dois objetos distintos na memória. - Criamos
intObj3e atribuímosintObj1a ele. Isso significa queintObj3eintObj1agora apontam para o mesmo objeto na memória. - Usamos
==para compararintObj1comintObj2eintObj3. - Usamos o método
equals()para comparar os valores deintObj1comintObj2eintObj3.
- Criamos dois objetos
Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa no Terminal:
javac HelloJava.javaExecute o programa compilado:
java HelloJavaA saída deve ser:
Comparing Integer objects with ==: intObj1 == intObj2 is false intObj1 == intObj3 is true Comparing Integer objects with equals(): intObj1.equals(intObj2) is true intObj1.equals(intObj3) is trueEsta saída mostra claramente a diferença:
intObj1 == intObj2éfalseporque eles são objetos diferentes na memória, embora seus valores sejam os mesmos.intObj1 == intObj3étrueporque eles se referem ao exato mesmo objeto.intObj1.equals(intObj2)étrueporque o métodoequals()compara os valores dos objetos, que são ambos 100.intObj1.equals(intObj3)também étrueporque eles se referem ao mesmo objeto, e seus valores são os mesmos.
Nota Importante: Para pequenos valores inteiros (tipicamente -128 a 127), Java usa um cache para objetos
Integer. Isso significa queInteger intObjA = 50; Integer intObjB = 50;pode resultar emintObjA == intObjBsendotrueporque eles podem se referir ao mesmo objeto em cache. No entanto, confiar nesse comportamento de cache para verificações de igualdade não é recomendado. Sempre use o métodoequals()para comparar os valores dos objetos da classe wrapper.
Esta etapa destaca a diferença crucial entre comparar tipos primitivos e objetos em Java e a importância de usar o método equals() para comparação de valores de objetos.
Resumo
Neste laboratório, aprendemos como verificar se um número é zero em Java. Começamos usando o operador fundamental de igualdade (==) para comparar uma variável inteira com zero dentro de uma instrução if. Isso demonstrou o princípio básico de verificações condicionais baseadas em igualdade numérica.
Em seguida, exploramos as nuances do tratamento de números de ponto flutuante e os potenciais problemas de precisão que surgem ao compará-los diretamente com zero usando ==. Finalmente, examinamos como realizar verificações de zero com as classes wrapper do Java, entendendo como acessar e comparar os valores primitivos subjacentes.



