Question

Je dois comparer la partie entière de deux doubles pour l'inégalité et je le fais actuellement:

int iA = (int)dA;
int iB = (int)dB;

if( iA != iB )
{
    ...
}

mais je me demande s’il existe une meilleure approche que celle-là.

Merci.

Si j'utilisais Math.Truncate () au lieu d'un transtypage en int, serait-il toujours exact de comparer les deux valeurs doubles résultantes pour l'égalité?

À propos des commentaires sur la notation hongroise:

Je n’utilise jamais HN moi-même, pas du moins comme le font la plupart des gens. Mais c’est l’un de ces rares cas où la sémantique d’une variable est directement liée à son type. J'aurais pu choisir une autre syntaxe comme A_As_Integer et B_As_NonInteger mais quelle aurait été la différence alors?

Était-ce utile?

La solution

Utilisez Math.Truncate () i.e.

if (Math.Truncate(x) == Math.Truncate(y))

[Éditer] Il a été pris conscience que si vous comparez des parties entières de doublons, la conversion aux valeurs entières risque en premier lieu de provoquer des débordements si vos doublons se situent en dehors de la plage pouvant être représentée par int.

Truncate renvoie un nombre décimal ou un double en évitant ce problème.

Autres conseils

Oui, c'est la meilleure approche.

En vous basant sur le libellé de votre question, vous n’êtes pas inquiet au sujet de l’arrondi ... uniquement de la partie entière elle-même.

c'est à dire. (int) 4.1 donnera le même résultat que (int) 4.9

Comme Ovid l'a indiqué, si vous n'avez besoin que des variables pour la comparaison, il vous suffira de convertir les doublons dans l'instruction de comparaison. Je ne regardais que la théorie.

Personnellement, j'essaie d'éviter de créer des variables supplémentaires sauf si j'en ai besoin.

if ( (int)dA != (int)dB ) {
    ...
}

À mesure que le code évolue au fil du temps, le fait d'avoir des variables supplémentaires qui traînent dans le vide ne crée aucune confusion. Bien sûr, si vous avez besoin de ces variables, c'est un autre problème:)

Remarque secondaire: vous semblez essayer d'indiquer le type de données via une simple notation hongroise. Puis-je recommander de ne pas faire ça? Si vous devez préfixer les informations à vos variables, essayez de préfixer à quoi la variable est destinée, plutôt que son type. Si vous faites cela, les erreurs de code peuvent être plus faciles à voir:

if ( (int)ageA != (int)idB ) {
    ...
}

Dans ce cas, sans même connaître les données, voir que vous essayez de comparer un "âge" avec un "identifiant" est un bon indice que quelque chose ne va pas ici.

Je conviens que Truncate est ce que vous voulez.

Quelques informations utiles issues de MSDN :

Truncate renvoie le nombre restant après la suppression des chiffres fractionnaires.

Il arrondit à l'entier le plus proche de zéro.

double floatNumber;

floatNumber = 32.7865;
// Displays 32      
Console.WriteLine(Math.Truncate(floatNumber));

floatNumber = -32.9012;
// Displays -32       
Console.WriteLine(Math.Truncate(floatNumber));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top