Comment bien comparer les valeurs après la virgule en C#?
Je viens d'un milieu en C++, et je sais que vous ne pouvez pas comparer avec précision les flotteurs pour l'égalité. Pour le C#, j'ai simplement supposé la même politique s'applique à des valeurs décimales, ou toute valeur à virgule flottante en général.
En gros, j'ai deux valeurs décimales et si elles ne sont PAS égaux les uns aux autres, j'ai besoin d'effectuer une action. par exemple:
decimal value1, value2;
//Assume value1 and value2 are set somewhere to valid values.
if( value1 != value2 )
{
//Do something
}
Si cela ne fonctionne pas comme prévu, je suis prêt à accepter une solution qui répond à une comparaison d'égalité avec une marge d'erreur, dire comme .00001 ou quelque chose comme ça. Quelle serait la solution recommandée pour ce problème?
- Ce n'est pas exactement la même comme il se rapporte à double plutôt que de virgule mais jetez un oeil à stackoverflow.com/questions/485175/...
- Bon point. Retirée.
- Votre posté code est la bonne façon de comparer deux décimales. Si vous voulez comparer deux décimales avec une marge d'erreur, vous ne
if (Math.Abs(value2 - value1) < 0.00001) { ... }
. - Quand vous dites "décimal", tu parles de le
decimal
type utile pour les financiers et des calculs monétaires ou êtes-vous à l'aide de "virgule" comme un terme générique pour une variété de virgule flottante de formats, y comprisdouble
,float
, etdecimal
(en lien ci-dessus)? - Je tiens à préciser que mon utilisation de la "virgule" dans mon post original. En gros, je fais référence à ce type réel 'virgule' (le mot clé). Je ne comprends pas vraiment ce que les données sous-jacentes ressemble pour types décimaux, j'ai simplement supposé qu'ils étaient des valeurs à virgule flottante, où pour les fractions de types qu'ils ne sont jamais exactement les mêmes (comme avec les chars & double en C++).
Vous devez vous connecter pour publier un commentaire.
Votre code fonctionne comme prévu. C#
decimal
s sont optimisés pour être très précis à la représentation en base 10 des nombres, donc si c'est ce que vous êtes en comparant (argent, ...), tout devrait bien se passer.Voici un très explication claire quant à la précision des décimales par Jon Skeet:
0.0000 != 0.0
renvoie la valeur true. Cependant!(0.000).Equals(0.0)
renvoie la valeur false.Que j'enquêtais sur quelque chose de similaire, mais avec une précision au lieu d'une marge d'erreur et a fini par écrire quelques extensions pour le Flotteur. Cela peut facilement être adapté pour tout type de bien. J'ai une série compliquée de comparaisons et de ce fait, il est agréable et lisible.
Je suis d'accord avec les autres réponses, mais je rencontre un problème où l'on "authentique" côté serveur décimal obtient en comparaison avec celle provenant du JSON/navigateur (et doit avoir été un flotteur à un certain point).
J'ai fini avec ce code de arrondir à 2 chiffres après le point décimal, qui a été assez précis dans mon cas:
Je pense que cette permettra de résoudre votre problème.
Fondamentalement, il ya un nombre décimal.la méthode de comparaison.
EDIT: C'est peut-être la meilleure méthode:
Décimal.Est égal à
EDIT2: Si vous pouvez comparer directement comme suggéré ci-dessus, qui pourraient être plus efficaces. Je vais laisser cela comme il peut être d'intérêt.
x == y
, où x est une variable point genre. (Le fait que les décimales ont une précision fixe est seulement un peu pertinents, comme c'est le calcul qui est là, c'est problématique.)