C # .Net numéro double ... 6.8! = 6.8?
-
29-09-2019 - |
Question
Je faisais des tests unitaires au travail et une erreur particulière surgit pour l'une des affirmations. Notez que expectedValue et actualValue sont les deux doubles.
Assert.AreEqual(expectedValue, actualValue);
L'exception a déclaré qu'ils ne sont pas égaux, que l'élaboration de "valeur attendue: <6,8> Valeur réelle:. <6,8>"
La valeur attendue est un disque codé 6.8 et la valeur réelle est formulée à partir des valeurs de base de données en passant par nos méthodes de classification (tels que l'égalité Records, ou Jenks Coupures naturelles).
Je pense que la différence est sans doute que les mantisses des 2 valeurs sont en hausse similaires jusqu'à ce que le bit le moins significatif. Je mis à jour les tests pour inclure un epsilon pour trouver si les deux valeurs sont assez proches, mais je suis curieux de s'il y a un moyen de forcer la mantisse pour correspondre à la valeur d'affichage si j'ai montré que le double. Est-ce une telle correction exist mantisse?
La solution
Je ne suis pas tout à fait sûr de ce que vous voulez dire en forçant la mantisse pour correspondre à la valeur d'affichage ... il sont pas de valeurs doubles qui sont exactement 0,1, par exemple.
Si vous voulez un peu de code pour afficher Toutefois, exactement valeur d'un double, j'ai le dossier de DoubleConverter.cs qui le rend facile:
double d = 0.1;
string x = DoubleConverter.ToExactString(d);
Une autre alternative consiste à utiliser le spécificateur de format aller-retour ( « r ») lors de la conversion d'un double à chaîne - qui garantit que le résultat a suffisamment d'informations pour reproduire exactement la même valeur plus tard. En d'autres termes, si x != y
, puis x.ToString("r") != y.ToString("r")
.
Autres conseils
Vous pourriez convertir à la fois à une chaîne: actualValue.ToString("0.000")
et comparer ces chaînes.
Cela pourrait être fait pour répondre à vos besoins de près.
Si vous voulez tester si les valeurs d'affichage par défaut correspondent, il suffit de comparer les valeurs d'affichage par défaut:
Assert.AreEqual(expectedValue.ToString(), actualValue.ToString());