Maison >développement back-end >C++ >Pourquoi « x == 0.1 » ne fonctionne-t-il pas toujours avec le type de données « double » de C# ?
C# double
Comparaisons : problèmes de précision
Travailler avec des nombres à virgule flottante (comme le type double
de C#) présente souvent des défis inattendus lors de la comparaison de valeurs. Un exemple courant consiste à comparer une variable double
à 0,1 :
<code class="language-csharp">double x = 0.1; if (x == 0.1) { /* Code */ }</code>
Cette comparaison apparemment simple pourrait étonnamment échouer.
Comprendre le problème : représentation binaire ou décimale
La cause première réside dans la façon dont les nombres à virgule flottante sont stockés. double
les valeurs sont stockées sous forme de fractions binaires et non de fractions décimales. Cela signifie que de nombreuses valeurs décimales, dont 0,1, ne peuvent pas être représentées avec précision sous forme de fraction binaire. L'ordinateur stocke plutôt une approximation, ce qui entraîne des différences subtiles qui affectent les comparaisons.
La solution : utiliser le decimal
Type de données
Pour éviter ce problème de précision, utilisez le type de données decimal
. decimal
les valeurs sont stockées en utilisant la notation décimale, permettant une représentation exacte de nombres comme 0,1.
<code class="language-csharp">decimal x = 0.1m; if (x == 0.1m) { /* Code */ }</code>
L'utilisation de decimal
garantit un stockage et une comparaison précis de 0,1.
Représentation à virgule flottante : un examen plus approfondi
Pour illustrer le problème, considérons la représentation décimale. 12.34 est :
<code>1 * 10^1 + 2 * 10^0 + 3 * 10^-1 + 4 * 10^-2</code>
De même, 0,1 est :
<code>1 * 10^-1</code>
Cependant, en binaire, certains nombres (comme 1/10 ou 0,1 décimal) manquent de représentation précise. Ils sont approximés, ce qui conduit à des écarts qui entraînent des résultats inattendus dans les comparaisons. Cette approximation explique pourquoi x == 0.1
peut échouer lorsque x
est un double
.
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!