Tengo un código para calcular la diferencia porcentual entre 2 números - (oldNum - newNum)/oldNum * 100;
- donde ambos números son double
s. 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?¿Por qué Java no arroja una excepción al dividir por 0.0?
Respuesta
El resultado de la división por cero es, matemáticamente hablando, indefinido, que se puede expresar con un flotador/doble (como NaN
- no es un número), no es, sin embargo, mal 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.
Exactamente. Esto está definido en la Especificación del lenguaje Java aquí: http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 –
Intenté dar salida al resultado, y es un valor NaN. ¿Eso significa que los ints no pueden contener NaN? – froadie
pero este es el caso de '0.0/0.0' que es NaN. –
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 los números de coma flotante, en particular el concepto de Not a Number (NaN).
Si está interesado en obtener más información sobre la representación en coma flotante, le aconsejo que lea this document (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.
de Java float
y double
tipos, como casi cualquier otro idioma por ahí (y casi cualquier unidad de FP de hardware), implementan la norma IEEE 754 para las matemáticas de punto flotante, que obliga a la división por cero para devolver un valor especial "infinito" . Lanzar una excepción en realidad violaría ese estándar.
La aritmética de enteros (implementada como two's complement representada 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.
La respuesta correcta a esta pregunta debería ser esta. Necesitaba saber por qué 'float' y' double' no causan Excepciones. Gracias. –
Esta debería ser la respuesta correcta.La respuesta actualmente marcada como correcta no responde a la pregunta, ni deja en claro que Java sigue a IEEE 754. – Necrototem
Aunque los desarrolladores de Java saben sobre el tipo primitivo doble y Double
clase, mientras se hace la aritmética de punto flotante que no prestan suficiente atención a Double.INFINITY
, NaN
, -0.0
y otras normas que rigen los cálculos aritméticos que implican ellos.
La respuesta simple a esta pregunta es que no arrojará ArithmeticException
y devolverá Double.INFINITY
. Además, tenga en cuenta que la comparación x == Double.NaN
siempre evalúa a false
, incluso si x
es un NaN
.
Para comprobar si x
es un , se debe utilizar la llamada al método 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 usted.
cuando se divide por cero (0 ó 0,00)
Si se divide por el doble 0, JVM mostrará Infinity.
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
Consola:
Infinity
Si se divide int por 0, y JVM lanzará excepción aritmética.
public static void main(String [] args){ int a=10; System.out.println(a/0); }
Consola:
Exception in thread "main" java.lang.ArithmeticException:/by zero
Pero si dividimos por int 0.0, a continuación, se mostrará JVM 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".
- 1. ¿Por qué dividir un flotante por un entero devuelve 0.0?
- 2. ¿Por qué XmlSerializer.Deserialize arroja una excepción System.IO.FileLoadException?
- 3. ¿Por qué arroja una excepción de referencia nula?
- 4. ¿Por qué hacer POST arroja una excepción en MVC 4?
- 5. ¿Por qué esta asignación C# arroja una excepción?
- 6. ¿Por qué un objeto eliminado no arroja una excepción al usarlo después de eliminarlo?
- 7. ¿Por qué esto arroja una excepción de valor NULO?
- 8. Java: ¿por qué no puedo lanzar una excepción en Comparator?
- 9. ¿Por qué Property Set arroja la excepción StackOverflow?
- 10. ¿Por qué EndGetResponse arroja ArgumentNullException?
- 11. ¿por qué funciona n.GetHashCode() pero n.GetType() arroja y la excepción?
- 12. ¿Por qué XmlSerializer arroja una InvalidOperationException?
- 13. ¿Por qué getCanonicalPath arroja una excepción comprobada mientras que getAbsolutePath no?
- 14. ¿Por qué Process.WaitForExit arroja una excepción de "no proceso" incluso cuando existe un proceso?
- 15. Por qué la coincidencia de patrones no arroja una excepción en Maybe monad
- 16. ¿Por qué Android Geocoder arroja una excepción de "Servicio no disponible"?
- 17. División por cero no arroja SIGFPE
- 18. IE9 arroja excepciones al cargar scripts en iframe. ¿Por qué?
- 19. ¿Por qué System.Web.Hosting.ApplicationHost.CreateApplicationHost arroja System.IO.FileNotFoundException?
- 20. ¿Por qué el '{' arroja una NullReferenceException en un método estático?
- 21. ¿Por qué no puedo dividir un fixnum por otro fixnum?
- 22. ¿Por qué Eclipse 3.2 arroja un error al iniciar
- 23. ¿Por qué no puedo dividir un datetime.timedelta por un flotante?
- 24. En clojure, ¿por qué un comentario en bloque que contiene una url arroja una excepción?
- 25. Java - comprobación si parseInt arroja la excepción
- 26. GetRequestStream arroja la excepción Timeout al azar
- 27. Por qué este código arroja System.ExecutionEngineException
- 28. ¿Por qué la excepción (int) (objeto) de 10m arroja el "lanzamiento especificado no es válido"?
- 29. ¿Por qué la instancia simulada creada con Moq arroja una excepción System.BadImageFormatException?
- 30. ¿Por qué el subproceso arroja OSError aquí?
Buena pregunta: la inconsistencia entre el entero y el comportamiento doble agrega confusión y molestia. –
posible duplicado de [¿Por qué la división por cero con números de punto flotante (o precisión doble) no arroja java.lang.ArithmeticException:/por cero en Java] (http://stackoverflow.com/questions/12954193/why-does- division-by-zero-with-floating-point-or-double-precision-numbers-not) – Raedwald
@Raedwald - teniendo en cuenta que esta pregunta fue publicada dos años y medio antes de la que enlazó, yo diría que esa pregunta es (posible) duplicado de este :) – froadie