Maison > Java > javaDidacticiel > le corps du texte

Comment éviter les erreurs de précision en virgule flottante en Java : flotteurs, doubles et BigDecimal

Susan Sarandon
Libérer: 2024-11-18 04:43:02
original
764 Les gens l'ont consulté

How to Avoid Floating Point Precision Errors in Java: Floats, Doubles, and BigDecimal

Éviter les erreurs de précision en virgule flottante avec les flottants et les doubles en Java

Lorsque vous travaillez avec de grandes sommes de flottants ou de doubles en Java, accumuler des virgules flottantes des erreurs de précision peuvent être un problème. Cette erreur est due à l'incapacité des flottants ou des doubles à représenter avec précision certaines valeurs numériques, telles que 0,1.

Considérez le code suivant :

for (float value = 0.0f; value < 1.0f; value += 0.1f) {
    System.out.println(value);
}
Copier après la connexion

Sortie attendue :

0.1
0.2
0.3
...
0.9
Copier après la connexion
Copier après la connexion

Sortie réelle :

0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
Copier après la connexion

Comme évident, la sortie s'écarte des valeurs attendues en raison d'inexactitudes en virgule flottante. Pour résoudre ce problème, il existe deux approches principales :

1. Ajustez la précision de l'affichage et autorisez les tolérances

Lors de l'utilisation du type double, limitez l'affichage au nombre requis de chiffres et introduisez une petite tolérance pour les contrôles d'égalité. Cela permet la représentation de nombres tels que 0,1 sans erreurs d'arrondi significatives.

2. Utilisez BigDecimal pour une représentation précise

Vous pouvez également envisager d'utiliser BigDecimal au lieu de flottants ou de doubles. BigDecimal fournit un moyen de représenter des nombres avec une précision arbitraire, éliminant les erreurs d'arrondi et permettant une représentation exacte de valeurs comme 0,1.

Vous trouverez ci-dessous un exemple utilisant BigDecimal :

BigDecimal step = new BigDecimal("0.1");
for (BigDecimal value = BigDecimal.ZERO;
     value.compareTo(BigDecimal.ONE) < 0;
     value = value.add(step)) {
    System.out.println(value);
}
Copier après la connexion

Ce code s'imprimera :

0.1
0.2
0.3
...
0.9
Copier après la connexion
Copier après la connexion

En choisissant l'approche appropriée, les développeurs peuvent minimiser ou éliminer efficacement les erreurs de précision en virgule flottante lorsqu'ils travaillent avec des flottants ou des doubles en Java.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal