Le code suivant en C# ne fonctionne pas :
int iValue = 0;
double dValue = 0.0;
bool isEqual = iValue.Equals(dValue);
La question est donc la suivante : quelle est la meilleure façon de comparer Double et Int ?
Le code suivant en C# ne fonctionne pas :
int iValue = 0;
double dValue = 0.0;
bool isEqual = iValue.Equals(dValue);
La question est donc la suivante : quelle est la meilleure façon de comparer Double et Int ?
On ne peut vraiment pas comparer les valeurs à virgule flottante et les valeurs intégrales de manière naïve, d'autant plus qu'il existe le classique virgule flottante les défis de la représentation . Ce que vous peut est de soustraire l'un de l'autre et de voir si la différence entre les deux est inférieure à une précision qui vous importe, comme ceci :
int iValue = 0;
double dValue = 0.0;
var diff = Math.Abs(dvalue - iValue);
if( diff < 0.0000001 ) // need some min threshold to compare floating points
return true; // items equal
Vous devez vraiment définir vous-même ce que equality
signifie pour vous. Par exemple, vous pouvez souhaiter qu'une valeur à virgule flottante soit arrondie à l'entier le plus proche, de sorte que 3,999999981 soit "égal" à 4. Ou vous pouvez vouloir tronquer la valeur, de sorte qu'elle soit effectivement égale à 3. Tout dépend de ce que vous essayez d'obtenir.
EDIT : Notez que j'ai choisi 0.0000001 comme exemple de valeur seuil ... vous devez décider vous-même quelle précision est suffisante pour la comparaison. Réalisez simplement que vous devez rester dans les limites normales de représentation de double
qui, je crois, est défini comme suit Double.Epsilon
.
C'est une très mauvaise idée de comparer des entiers et des nombres à virgule flottante pour l'égalité dans n'importe quel langage. Cela fonctionne dans des cas très simples, mais dès que vous faites des calculs, la probabilité que le programme fasse ce que vous voulez diminue de façon spectaculaire.
Cela est dû à la manière dont les nombres à virgule flottante sont stockés dans un système numérique binaire.
Si vous êtes sûr de vouloir l'utiliser, créez une classe pour créer votre propre nombre avec des fractions. Utilisez un int pour gérer le nombre entier, et un autre int pour gérer la fraction.
Cela dépend vraiment de ce que vous considérez comme "égal". Si vous voulez que votre comparaison renvoie vrai si et seulement si le double correspond précisément à la valeur entière (c'est-à-dire qu'il n'y a pas de composante fractionnaire), vous devez convertir votre int en un double pour effectuer la comparaison :
bool isEqual = (double)iValue == dValue;
Si quelque chose comme 1,1 est considéré comme égal à 1, vous pouvez soit convertir le double en un int (si vous voulez ignorer complètement la composante fractionnaire), soit arrondir le double si vous voulez que 1,9 soit égal à 2.
De nos jours, le seul moment où l'on doit comparer les valeurs de types double
et soit integer
o long
pour une égalité stricte, c'est lorsque, pour une raison quelconque, on est obligé de stocker ou de transmettre des quantités intégrales sous forme de valeurs à virgule flottante et qu'il faut ensuite les reconvertir. Dans la plupart des cas, une telle conversion peut être accomplie plus facilement en coulant le type intégral en double
puis en comparant le résultat de ce lancer. Notez que la conversion de long
a double
peut être imprécis si le nombre est en dehors de la plage ±2 52 . Néanmoins, avant l'avènement du 64 bits long
est devenu disponible, double
était un type de stockage pratique pour les quantités entières qui étaient trop grandes pour un système 32 bits. int
mais suffisamment petite pour être gérée par double
.
Notez que la conversion d'un long
a double
et ensuite effectuer la comparaison donnera un résultat "égal" si la valeur nominale de la double
ne correspond pas précisément à la long
mais représente la valeur la plus proche possible double
à cette valeur. Ce comportement est logique si l'on reconnaît que les types à virgule flottante ne représentent pas réellement une seule valeur précise, mais plutôt une gamme de valeurs.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.