Introducción
En este laboratorio, aprenderás cómo verificar si un número es cero en Java. Esta habilidad fundamental es crucial para controlar el flujo del programa utilizando declaraciones condicionales. Comenzaremos explorando el uso del operador de igualdad (==) para comparar valores enteros con cero.
A continuación, abordaremos las consideraciones específicas y los posibles errores al trabajar con números de punto flotante y cero debido a problemas de precisión. Finalmente, examinaremos cómo realizar comprobaciones de cero cuando se trabaja con las clases envolventes (wrapper classes) de Java para tipos primitivos.
Usar el operador de igualdad para verificar cero
En este paso, exploraremos cómo verificar si un número es igual a cero en Java utilizando el operador de igualdad. Esta es una operación fundamental en la programación, a menudo utilizada en declaraciones condicionales para controlar el flujo de tu programa.
En Java, el operador de igualdad se representa por ==. Se utiliza para comparar dos valores y devuelve true si son iguales, y false en caso contrario.
Vamos a crear un simple programa en Java para demostrar esto.
Abre el archivo
HelloJava.javaen el editor WebIDE si no está abierto.Reemplaza todo el contenido del archivo con el siguiente 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."); } } }Analicemos este nuevo código:
int number = 0;: Esta línea declara una variable entera llamadanumbere inicializa su valor en0.if (number == 0): Esta es una declaraciónif, que se utiliza para tomar decisiones en tu código. La condición dentro de los paréntesis(number == 0)verifica si el valor de la variablenumberes igual a0.System.out.println("The number is zero.");: Esta línea se ejecutará solo si la condiciónnumber == 0estrue.else: Esta palabra clave introduce el bloque de código que se ejecutará si la condición delifesfalse.System.out.println("The number is not zero.");: Esta línea se ejecutará solo si la condiciónnumber == 0esfalse.
Guarda el archivo (Ctrl+S o Cmd+S).
Ahora, compilaremos nuestro programa modificado. En la Terminal, asegúrate de estar en el directorio
~/project. Puedes usarcd ~/projectsi es necesario. Luego, ejecuta:javac HelloJava.javaSi la compilación es exitosa, no verás ninguna salida.
Finalmente, ejecutemos nuestro programa:
java HelloJavaDeberías ver la siguiente salida:
The number is zero.Esto confirma que nuestro programa verificó correctamente si la variable
numberera igual a cero utilizando el operador==.
Ahora, intenta cambiar el valor de la variable number a un valor distinto de cero (por ejemplo, int number = 5;), guarda el archivo, recompila y ejecuta el programa de nuevo para ver la salida diferente.
Manejar la precisión de números de punto flotante
En este paso, exploraremos un problema común cuando se trabaja con números de punto flotante (números con decimales) en la programación: la precisión. Debido a cómo los computadores almacenan estos números, las comparaciones de igualdad directas utilizando == a veces pueden dar lugar a resultados inesperados.
Veamos esto en acción.
Abre el archivo
HelloJava.javaen el editor WebIDE.Reemplaza el código existente con el siguiente:
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."); } } }En este código:
- Declaramos dos variables de tipo
double,num1ynum2.doublees un tipo de dato en Java utilizado para almacenar números de punto flotante. - Asignamos
0.1 + 0.2anum1y0.3anum2. Matemáticamente, estos deberían ser iguales. - Imprimimos los valores de
num1ynum2para ver su representación exacta. - Utilizamos el operador
==para verificar sinum1es igual anum2.
- Declaramos dos variables de tipo
Guarda el archivo (Ctrl+S o Cmd+S).
Compila el programa en la Terminal:
javac HelloJava.javaEjecuta el programa compilado:
java HelloJavaPuedes sorprenderse con la salida:
num1: 0.30000000000000004 num2: 0.3 num1 is not equal to num2.Como puedes ver,
num1no es exactamente0.3debido a la forma en que se almacenan los números de punto flotante. Este es un problema común y es por eso que generalmente se desaconseja comparar directamente números de punto flotante para verificar la igualdad utilizando==.
Para manejar esto, en lugar de verificar la igualdad exacta, generalmente verificamos si la diferencia absoluta entre los dos números está dentro de una tolerancia muy pequeña (a menudo llamada "epsilon").
Modifiquemos el código para utilizar este enfoque.
Abre
HelloJava.javade nuevo.Reemplaza la declaración
ifcon la siguiente: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."); }Aquí:
- Definimos un valor pequeño de
epsilon. Math.abs(num1 - num2)calcula la diferencia absoluta entrenum1ynum2.- Verificamos si esta diferencia absoluta es menor que nuestro
epsilon.
- Definimos un valor pequeño de
Guarda el archivo.
Compila el programa:
javac HelloJava.javaEjecuta el programa:
java HelloJavaAhora la salida debería ser:
num1: 0.30000000000000004 num2: 0.3 num1 is approximately equal to num2.Esto demuestra la forma correcta de comparar números de punto flotante para verificar la igualdad práctica teniendo en cuenta las limitaciones de precisión.
Probar con clases envolventes (Wrapper Classes)
En este paso, exploraremos cómo funciona la igualdad con las clases envolventes (wrapper classes) de Java. Las clases envolventes son clases especiales que proporcionan una forma de utilizar tipos de datos primitivos (como int, double, boolean) como objetos. Por ejemplo, la clase envolvente para int es Integer, y para double es Double.
Cuando se comparan objetos en Java, el operador == verifica si las dos variables se refieren al mismo objeto exacto en memoria, no si sus valores son iguales. Para comparar los valores de los objetos, se debe utilizar el método equals().
Veamos cómo esto se aplica a las clases envolventes.
Abre el archivo
HelloJava.javaen el editor WebIDE.Reemplaza el código existente con el siguiente:
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"); } } }En este código:
- Creamos dos objetos
Integer,intObj1eintObj2, con el mismo valor (100) utilizandonew Integer(). Esto crea dos objetos distintos en memoria. - Creamos
intObj3y le asignamosintObj1. Esto significa queintObj3eintObj1ahora apuntan al mismo objeto en memoria. - Utilizamos
==para compararintObj1conintObj2yintObj3. - Utilizamos el método
equals()para comparar los valores deintObj1conintObj2yintObj3.
- Creamos dos objetos
Guarda el archivo (Ctrl+S o Cmd+S).
Compila el programa en la Terminal:
javac HelloJava.javaEjecuta el programa compilado:
java HelloJavaLa salida debería 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 salida muestra claramente la diferencia:
intObj1 == intObj2esfalseporque son objetos diferentes en memoria, aunque sus valores sean iguales.intObj1 == intObj3estrueporque se refieren al mismo objeto exacto.intObj1.equals(intObj2)estrueporque el métodoequals()compara los valores de los objetos, que son ambos 100.intObj1.equals(intObj3)también estrueporque se refieren al mismo objeto y sus valores son iguales.
Nota importante: Para valores enteros pequeños (por lo general, de -128 a 127), Java utiliza una caché para los objetos
Integer. Esto significa queInteger intObjA = 50; Integer intObjB = 50;podría resultar enintObjA == intObjBsiendotrueporque podrían referirse al mismo objeto en caché. Sin embargo, no se recomienda confiar en este comportamiento de caché para las comprobaciones de igualdad. Siempre utiliza el métodoequals()para comparar los valores de los objetos de las clases envolventes.
Este paso destaca la diferencia crucial entre comparar tipos primitivos y objetos en Java y la importancia de utilizar el método equals() para la comparación de valores de objetos.
Resumen
En este laboratorio (lab), aprendimos cómo verificar si un número es cero en Java. Comenzamos utilizando el operador de igualdad fundamental (==) para comparar una variable entera con cero dentro de una declaración if. Esto demostró el principio básico de las comprobaciones condicionales basadas en la igualdad numérica.
Luego exploramos los matices del manejo de números de punto flotante y los posibles problemas de precisión que surgen cuando se los compara directamente con cero utilizando ==. Finalmente, examinamos cómo realizar comprobaciones de cero con las clases envolventes (wrapper classes) de Java, comprendiendo cómo acceder y comparar los valores primitivos subyacentes.



