¿Por qué Java no lanza una excepción al dividir por 0.0?
types integer (5)
Tengo un código para calcular la diferencia porcentual entre 2 números: (oldNum - newNum) / oldNum * 100;
- donde ambos números son double
. Esperaba tener que agregar algún tipo de control / manejo de excepciones en caso de que oldNum sea 0. Sin embargo, cuando realicé una prueba con valores de 0.0 para oldNum y newNum, la ejecución continuó como si nada hubiera sucedido y no se hubiera producido ningún error. Ejecutar este código con int
s definitivamente causaría una excepción de división aritmética por cero. ¿Por qué Java lo ignora cuando se trata de double
s?
Aunque los desarrolladores de Java conocen el doble primitivo y la clase Double
, al hacer aritmética en coma flotante no prestan suficiente atención a Double.INFINITY
, NaN
, -0.0
y otras reglas que rigen los cálculos aritméticos que los involucran.
La respuesta simple a esta pregunta es que no lanzará ArithmeticException
y devolverá Double.INFINITY
. Además, tenga en cuenta que la comparación x == Double.NaN
siempre se evalúa como false
, incluso si x
mismo es un NaN
.
Para probar si x
es un NaN
, se debe usar el método llamado Double.isNaN(x)
para verificar si el número dado es NaN o no. Esto está muy cerca de NULL
en SQL
.
Puede ser útil para ti.
El resultado de la división por cero es, matemáticamente hablando, indefinido , que se puede expresar con un flotante / doble (como NaN
, no como un número), pero no es erróneo en ningún sentido fundamental.
Como un número entero debe contener un valor numérico específico, se debe generar un error en la división por cero al tratar con ellos.
La forma en que se almacena un doble es bastante diferente de un int. Consulte http://firstclassthoughts.co.uk/java/traps/java_double_traps.html para obtener una explicación más detallada sobre cómo maneja Java los cálculos dobles. También debe leer números flotantes, en particular, el concepto de No es un número (NaN) .
Si está interesado en obtener más información acerca de la representación en coma flotante, le aconsejo que lea este documento (formato de Word, lo siento). Se profundiza en la representación binaria de los números, lo que puede ser útil para su comprensión.
Los tipos double
y float
de Java, como casi cualquier otro lenguaje (y prácticamente cualquier unidad FP de hardware), implementan el estándar IEEE 754 para matemáticas de punto flotante, que ordena la división por cero para devolver un valor especial de "infinito". Lanzar una excepción en realidad violaría ese estándar.
La aritmética de enteros (implementada como representación de dos complementos por Java y la mayoría de los demás lenguajes y hardware) es diferente y no tiene valores especiales de infinito o NaN, por lo que arrojar excepciones es un comportamiento útil.
Cuando se divide por cero (0 o 0.00)
Si divide el doble por 0, JVM mostrará Infinity .
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
Consola:
Infinity
Si divide int por 0, entonces JVM lanzará Excepción aritmética .
public static void main(String [] args){ int a=10; System.out.println(a/0); }
Console:
Exception in thread "main" java.lang.ArithmeticException: / by zero
Pero si dividimos int por 0.0, entonces JVM mostrará Infinity:
public static void main(String [] args){ int a=10; System.out.println(a/0.0); }
Consola:
Infinity
Esto se debe a que JVM automáticamente escribirá "fundir int" en "double", por lo que obtendremos infinity en lugar de "ArithmeticException".