Comprendre les comparaisons à double précision en C#
Problème :
La comparaison directe de double
variables en C# peut donner des résultats inattendus. Par exemple, if (x == 0.1)
peut être évalué à false
même lorsque x
se voit attribuer la valeur 0.1
.
Cause fondamentale :
Le problème vient de la façon dont les nombres à virgule flottante (comme float
et double
) sont représentés dans la mémoire de l'ordinateur. Ils utilisent une représentation fractionnaire binaire, contrairement à la représentation fractionnaire décimale à laquelle nous sommes habitués. Cela signifie que de nombreuses valeurs décimales, telles que 0,1, ne peuvent pas être représentées avec précision en binaire. L'approximation résultante introduit de subtiles erreurs d'arrondi.
Résolution :
La solution la plus efficace consiste à utiliser le type de données decimal
lorsque la précision est primordiale. decimal
utilise une représentation fractionnaire décimale, capable de stocker avec précision des valeurs telles que 0,1.
Plus de détails :
Les fractions binaires, similaires aux fractions décimales, utilisent des puissances de 2 au lieu de puissances de 10. Tout comme 1/3 (0,3333...) ne peut pas être représenté exactement en décimal, 1/10 (0,1) n'a pas de représentation binaire exacte . Cette limitation inhérente conduit à des erreurs d’arrondi qui entraînent des écarts de comparaison. L'ordinateur stocke une approximation proche de 0,1, mais cette approximation n'est pas exactement égale au 0,1 littéral utilisé dans la comparaison.
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!