La seguente istruzione getta come ovvio lo java.lang.ArithmeticException:/by zero
.Perché la divisione per zero con numeri in virgola mobile (o precisione doppia) non genera java.lang.ArithmeticException:/per zero in Java
System.out.println(0/0);
perché il letterale 0
è considerato un int
letterale e dividere per zero non è consentito in aritmetica intera.
Il seguente caso però non gettare alcuna eccezione come java.lang.ArithmeticException:/by zero
.
int a = 0;
double b = 6.199;
System.out.println((b/a));
Visualizza Infinity
.
La seguente istruzione produce NaN
(Not a Number) senza eccezioni.
System.out.println(0D/0); //or 0.0/0, or 0.0/0.0 or 0/0.0 - floating point arithmetic.
In questo caso, entrambi gli operandi sono considerati raddoppiati.
Allo stesso modo, le seguenti affermazioni non gettare alcuna eccezione.
double div1 = 0D/0; //or 0D/0D
double div2 = 0/0D; //or 0D/0D
System.out.printf("div1 = %s : div2 = %s%n", div1, div2);
System.out.printf("div1 == div2 : %b%n", div1 == div2);
System.out.printf("div1 == div1 : %b%n", div1 == div1);
System.out.printf("div2 == div2 : %b%n", div2 == div2);
System.out.printf("Double.NaN == Double.NaN : %b%n", Double.NaN == Double.NaN);
System.out.printf("Float.NaN == Float.NaN : %b%n", Float.NaN == Float.NaN);
Producono il seguente output.
div1 = NaN : div2 = NaN
div1 == div2 : false
div1 == div1 : false
div2 == div2 : false
Double.NaN == Double.NaN : false
Float.NaN == Float.NaN : false
Tutti ritorno false.
Perché questa operazione (divisione per zero) permessi a virgola mobile o numeri di doppia precisione?
proposito, posso capire che i numeri in virgola mobile (numeri di doppia precisione) hanno i valori che rappresentano infinito positivo, infinito negativo, non un numero (NaN
) ...
Nel primo caso, dal momento che si sta utilizzando un int, la promozione potrebbe comportare qualcosa come 0.00..001, o qualcosa di simile a Double.MIN_VALUE, che fornirebbe un numero enorme se si divide nulla da essa . – broncoAbierto
@Tiny: Trasforma la tua domanda in giro: perché '1/0' lancia un'eccezione invece di restituire 'Infinito'? La risposta è che un intero in complemento a due (che è ciò che Java 'int' è) non ha alcun bit disponibile per memorizzare valori speciali come' Infinity' o 'NaN', quindi dal momento che il risultato non è rappresentabile nel tipo desiderato , un'eccezione deve essere lanciata. I numeri in virgola mobile non hanno questo problema (esiste un pattern di bit disponibile per 'Infinity'), e quindi non è necessaria alcuna eccezione. –