Pourquoi Java ne lance-t-il pas une exception lors de la division par 0.0?

J’ai un code pour calculer le pourcentage de différence entre 2 nombres – (oldNum - newNum) / oldNum * 100; – où les deux nombres sont double . Je m’attendais à devoir append une sorte de vérification / gestion des exceptions dans le cas où oldNum vaut 0. Cependant, lorsque j’ai effectué un test avec des valeurs de 0.0 pour oldNum et newNum, l’exécution s’est poursuivie comme si de rien n’était et qu’aucune erreur n’avait été générée. L’exécution de ce code avec int s provoquerait certainement une exception arithmétique de division par zéro. Pourquoi Java l’ignore-t-il lorsqu’il s’agit de double ?

Le résultat de la division par zéro est, mathématiquement parlant, indéfini , ce qui peut être exprimé par un flottant / double (comme NaN – pas un nombre), mais il n’est pas faux au sens fondamental.

Comme un nombre entier doit contenir une valeur numérique spécifique, une erreur doit être générée lors de la division par zéro.

Les types de float et double de Java, comme presque tous les autres langages (et pratiquement toutes les unités matérielles de FP), implémentent la norme IEEE 754 pour les calculs en virgule flottante, qui oblige à diviser par zéro pour renvoyer une valeur “infini” spéciale. Lancer une exception enfreindrait en fait cette norme.

L’arithmétique en nombres entiers (implémentée en tant que représentation du complément à deux par Java et la plupart des autres langages et matériels) est différente et n’a pas de valeurs d’infini ou de NaN spéciales.

La façon dont un double est stocké est très différente d’un int. Voir http://firstclassthoughts.co.uk/java/traps/java_double_traps.html pour une explication plus détaillée sur la manière dont Java gère les doubles calculs. Vous devriez également lire sur les nombres à virgule flottante, en particulier le concept de Not a Number (NaN) .

Si vous souhaitez en savoir plus sur la représentation en virgule flottante, je vous conseille de lire ce document (format Word, désolé). Il se penche sur la représentation binary des nombres, ce qui peut être utile pour votre compréhension.

Bien que les développeurs Java connaissent le type double primitive et la classe Double , tout en effectuant une arithmétique à virgule flottante, ils ne font pas assez attention à Double.INFINITY , NaN , -0.0 et aux autres règles régissant les calculs arithmétiques.

La réponse simple à cette question est qu’elle ne lancera pas ArithmeticException et retournera Double.INFINITY . Notez également que la comparaison x == Double.NaN toujours évaluée à false , même si x lui-même est un NaN .

Pour tester si x est un NaN , il faut utiliser l’appel à la méthode Double.isNaN(x) pour vérifier si le nombre donné est NaN ou non. Ceci est très proche de NULL en SQL .

Cela peut vous être utile.

Quand divisé par zéro (0 ou 0.00)

  1. Si vous divisez le double par 0, JVM affichera Infinity .

    public static void main(Ssortingng [] args){ double a=10.00; System.out.println(a/0); }

    Console: Infinity

  2. Si vous divisez int par 0, la machine virtuelle Java lancera une exception arithmétique .

    public static void main(Ssortingng [] args){ int a=10; System.out.println(a/0); }

    Console: Exception in thread "main" java.lang.ArithmeticException: / by zero

  3. Mais si on divise int par 0.0, alors JVM affichera Infinity:

    public static void main(Ssortingng [] args){ int a=10; System.out.println(a/0.0); }

    Console: Infinity

C’est parce que JVM va automatiquement taper cast int pour doubler, nous obtenons donc l’infini au lieu d’ArithmeticException.