round long java double int

round - long to int java



¿Por qué 1/0 da error pero 1/0.0 devuelve "Inf"? (4)

Solo tengo curiosidad sobre esto:

Al evaluar 1/0 en Java, se produce la siguiente excepción:

Excepción en el hilo "main" java.lang.ArithmeticException: / por cero en Foo.main (Foo.java:3)

Pero 1/0.0 se evalúa al Infinity .

public class Foo { public static void main (String[] args) { System.out.println(1/0.0); } }

¿Por qué pasó esto?


1/0 es una división de dos int s, y lanza una excepción porque no puede dividir por entero cero. Sin embargo, 0.0 es un literal de tipo doble y Java utilizará una división de punto flotante. La especificación de punto flotante IEEE tiene valores especiales para dividir por cero (entre otras cosas), uno de estos es doble. Infinito.

Si está interesado en los detalles, la especificación de punto flotante (que a menudo es críptica) tiene una página en Wikipedia: http://en.wikipedia.org/wiki/IEEE_754-2008 , y su texto completo también se puede leer en línea : http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933 .


1/0 es una división de enteros, 1 / 0.0 es una división de punto flotante: los flotantes pueden representar valores no válidos, los enteros no pueden.


El IEEE ha definido ciertos estándares para números de punto flotante que incluyen definiciones de "No es un número" e infinito positivo y negativo. Estos no se aplican a los enteros.

Consulte http://steve.hollasch.net/cgindex/coding/ieeefloat.html

La razón de estos casos especiales es básicamente errores de redondeo. Los números de punto flotante a menudo siempre se truncan porque nunca son exactos. Los enteros, por otro lado, son siempre exactos.


Esto se debe a que los enteros no tienen valores para +/- Inf, NaN, y no permiten la división por 0, mientras que los flotantes sí tienen esos valores especiales.