Un moyen fiable de comparer des valeurs doubles en C#
En C#, les comparaisons de valeurs en double précision conduisent souvent à des résultats inattendus en raison des limitations inhérentes à l'arithmétique à virgule flottante. Pour comprendre pourquoi cela se produit, examinons les raisons du manque de précision en virgule flottante.
Précision en virgule flottante insuffisante
Les types de données float et double stockent des valeurs numériques au format binaire. Ce format manque intrinsèquement de précision pour représenter avec précision certains nombres, y compris de simples valeurs décimales comme 0,1. Lorsque double reçoit une valeur de 0,1, il stocke en fait une représentation binaire qui est une approximation de la vraie valeur décimale. Ce manque de précision provient de la nature de la conversion des nombres décimaux en fractions binaires.
Solutions possibles
Pour gérer efficacement la comparaison de valeurs doubles, envisagez la solution suivante :
Comparaison de valeurs double à double : Lors de la comparaison de valeurs doubles, il n'est généralement pas recommandé d'utiliser l'opérateur d'égalité (==). Au lieu de cela, des méthodes de comparaison approximative peuvent être utilisées pour tenir compte des erreurs d’arrondi potentielles. Cela implique généralement de définir une valeur de tolérance et de comparer si la différence entre deux valeurs est inférieure à cette tolérance.
Type de données décimal : Pour des opérations et des comparaisons numériques précises, pensez à utiliser le type de données décimal, qui stocke les valeurs en notation décimale. Cette approche garantit une représentation précise des valeurs décimales comme 0,1.
Instructions supplémentaires
Le manque de précision dans le stockage flottant et double est dû au fait que la représentation binaire correspond naturellement aux valeurs numériques qui sont des puissances de 2, telles que 1/2, 1/4, etc. Cependant, une fraction décimale avec un dénominateur spécifique, tel que 0,1 (1/10), ne peut pas être représentée exactement en binaire sans entraîner des erreurs d'arrondi.
Exemple
<code class="language-csharp">double x = 0.1; double y = 0.1; double tolerance = 0.000001; // 定义容差 if (Math.Abs(x - y) < tolerance) // 使用容差进行近似比较 { // 代码块 }</code>
Cet exemple montre comment utiliser Math.Abs()
pour calculer la différence absolue entre deux valeurs doubles et la comparer à une tolérance prédéfinie, permettant une comparaison plus fiable des valeurs doubles. Le choix d'une valeur de tolérance appropriée dépend du scénario d'application spécifique et des exigences de précision.
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!