Maison  >  Article  >  Java  >  Pourquoi la multiplication en Java produit-elle des résultats inattendus lorsqu'il s'agit de grands nombres ?

Pourquoi la multiplication en Java produit-elle des résultats inattendus lorsqu'il s'agit de grands nombres ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-06 17:27:02360parcourir

Why Does Multiplication in Java Produce Unexpected Results When Dealing with Large Numbers?

Comprendre les résultats de multiplication et les types de données en Java

En Java, le résultat d'une opération de multiplication dépend des types de données des opérandes. Cela est particulièrement évident lors de la multiplication de grandes valeurs, comme illustré par l'exemple de code suivant :

long oneYearWithL = 1000 * 60 * 60 * 24 * 365L;
long oneYearWithoutL = 1000 * 60 * 60 * 24 * 365;
System.out.println(oneYearWithL); // Output: 31536000000
System.out.println(oneYearWithoutL); // Output: 1471228928

Explication :

  • oneYearWithL : En ajoutant 'L' à la fin du numéro, nous spécifions explicitement le type de données aussi long. Cela garantit que le résultat est stocké dans un entier de 64 bits, qui peut contenir de très grandes valeurs. Par conséquent, le résultat de la multiplication est correct et est égal à 3 153 600 000 millisecondes (ou années).
  • oneYearWithoutL : Lorsque nous omettons le « L », les opérandes sont traités comme des entiers de 32 bits. Le résultat de la multiplication de ces entiers dépasse la plage d'un entier, ce qui entraîne une valeur incorrecte : 1 471 228 928.

Comprendre le dépassement d'entier :

En Java, les entiers sont des valeurs signées de 32 bits, allant de -2 147 483 648 à 2 147 483 647. Lorsque le résultat d'une opération arithmétique dépasse ces limites, il revient du côté opposé de la plage, provoquant un débordement d'entier.

Dans notre exemple, le résultat de la multiplication de 1000 60 60 24 365 vaut 2 592 000 000. Étant donné que cette valeur dépasse la valeur entière maximale, elle revient à -1 702 967 297, ce que nous voyons comme résultat (1 471 228 928).

Conversion en type de données long :

Pour éviter un débordement d'entier, il est toujours conseillé d'utiliser le type de données long pour les calculs numériques volumineux. En spécifiant explicitement « L » après un nombre, nous pouvons forcer Java à traiter la valeur comme un entier long, garantissant ainsi que le résultat est stocké dans la variable longue de 64 bits.

Bonnes pratiques :

  • Utilisez le type de données long pour les grandes valeurs numériques.
  • Soyez conscient du risque de débordement d'entier et utilisez long ou BigInteger selon le cas.
  • Envisagez d'utiliser le flottant -nombres de points pour les calculs très grands ou décimaux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn