Maison >développement back-end >C++ >Pourquoi « x == 0.1 » ne fonctionne-t-il pas avec « double x = 0.1 » en C# ?

Pourquoi « x == 0.1 » ne fonctionne-t-il pas avec « double x = 0.1 » en C# ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-22 20:51:13640parcourir

Why Doesn't `x == 0.1` Work with `double x = 0.1` in C#?

Comparaison de nombres à virgule flottante en C# : dilemme décimal

En C#, vous pouvez rencontrer quelques problèmes lors de la comparaison de valeurs de type double. Considérez le code suivant :

<code class="language-csharp">double x = 0.1;
if (x == 0.1)
{
    // ...
}</code>

Étonnamment, ce code n'entre pas dans la déclaration if. Pourquoi est-ce ?

Problème de nombre à virgule flottante

La racine du problème réside dans la façon dont les ordinateurs représentent les nombres à virgule flottante (en particulier double). Contrairement aux nombres entiers, double utilise des fractions binaires au lieu de fractions décimales. Cela signifie que certaines valeurs décimales, telles que 0,1, ne peuvent pas être stockées exactement.

Par exemple, en notation binaire, 0,1 est représenté par 0,000110011001100110011001.... L'ordinateur tronque cette boucle infinie de décimales en une représentation finie, qui peut ne pas correspondre exactement à la valeur attendue.

Solution

Afin de résoudre ce problème, vous pouvez envisager les méthodes suivantes :

  • Utilisation du type decimal : Le type decimal stocke les nombres en utilisant la notation décimale, permettant une représentation précise.
  • Comparaison Epsilon : Utilisez une petite marge d'erreur (par exemple Math.Abs(x - 0.1)) pour comparer des nombres à virgule flottante.

Explication des raisons

Les fractions binaires diffèrent des fractions décimales par leur capacité à représenter certains nombres. Par exemple, le nombre 1/10 ne peut pas être représenté exactement en binaire, ce qui fait que son expansion binaire est d'environ 0,0001100... Le processus d'arrondi de l'ordinateur introduit des inexactitudes lors du stockage des nombres à virgule flottante.

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