Impression des valeurs double
Sur mon système, le code suivant imprime '3.6':
double a = 1.2;
int b = 3;
double c = a * b;
Console.WriteLine(c);
Mais dans le débogueur, je peux voir que c
a une valeur de plus de 2 chiffres:
Je sais que je peux afficher l'ensemble de la représentation avec Console.WriteLine("{0:R}", c)
. Est-ce la seule façon et recommandée pour afficher la valeur réelle d'un double
?
mise à jour
Va avec l'exemple ci-dessus, j'aimerais imprimer c
de telle sorte que si l'utilisateur de l'imprimé de la valeur et de l'insérer de nouveau dans le code dans un test à l'aide de ==
, la comparaison serait vrai. Dans ce cas c == 3.5999999999999996
renvoie la valeur true.
L'affichage dépend de ce que vous voulez faire avec elle.
combien de décimales êtes-vous désireux de l'affichage..?
Avis pour les autres answerers: la vraie question est au sujet de la comparaison doubles, non pas sur la mise en forme de la sortie. Je conseille @dharmatech de mettre à jour leur question.
combien de décimales êtes-vous désireux de l'affichage..?
Avis pour les autres answerers: la vraie question est au sujet de la comparaison doubles, non pas sur la mise en forme de la sortie. Je conseille @dharmatech de mettre à jour leur question.
OriginalL'auteur dharmatech | 2012-12-29
Vous devez vous connecter pour publier un commentaire.
3.999999999999996 n'est pas la valeur réelle de la double soit; c'est juste la valeur arrondie à quinze endroits ou quoi que ce soit. Il n'y a aucun moyen intégré pour afficher le exacte valeur que le double est représentant. C'est vraiment dommage, parce que chaque double normal peut être représenté exactement comme une chaîne décimale, et il serait agréable d'être en mesure de voir que.
Comme un service public, j'ai mis le code source pour un périphérique qui ne prend que sur mon blog:
http://ericlippert.com/2011/02/17/looking-inside-a-double/
Noter qu'il utilise le Rationnel de la classe à partir de Microsoft Solveur de la Fondation. Si vous n'avez pas cela, alors vous pouvez soit le télécharger gratuitement, ou écrire votre propre Rationnelle de la classe; c'est le caractère de le faire.
Si le sujet de la façon dont des doubles, des travaux en interne vous intéresse, envisager le contrôle de mon archive de pratique des articles qui expliquent tout cela. C'est à l':
http://blogs.msdn.com/b/ericlippert/archive/tags/floating+point+arithmétique/
Commencer par le bas; ceux qui sont dans l'ordre chronologique inverse de l'ordre.
Rational
classe. Mon projet que cette question a entraîné à partir de ses propres Rationnels. En fin de compte, il serait bon d'avoir la version C# de CLN. Ce serait bien si dans l'avenir, les principaux langages de venir avec une telle complète numérique de la tour.J'ai mis à jour la question avec mon réel objectif, puisque quelqu'un l'a demandé.
OriginalL'auteur Eric Lippert
Console.WriteLine
appelsDouble.ToString
qui utilise le "G" spécificateur de format. Il utilise la culture en cours pour déterminer le nombre de décimales (1 pour "en-US").Si vous souhaitez afficher les 8 décimales, vous pouvez utiliser le numérique spécificateur de format:
Chaînes de Format Numérique Standard
Modifier: Le débogueur utilise cette méthode pour convertir un double en une chaîne:
_ecvt_s
Je suppose que c'est le moyen le moins cher pour le convertir.
Où je l'ai trouvé: Comment Visual Studio afficher un Système.Double pendant le débogage?
Édité ma réponse. Pourquoi voulez-vous afficher la même chose que le débogueur?
J'aimerais afficher la valeur telle que, si cette valeur est ensuite tourné utilisé avec
==
, le test sera vrai. E. g. dans ce casc == 3.5999999999999996
en effet de retourner la valeur true.vous allez dans un territoire dangereux. Lire ceci: cygnus-software.com/papers/comparingfloats/comparingfloats.htm
OriginalL'auteur Rango
Vous pouvez également utiliser une approche différente, par exemple, si vous souhaitez renvoyer les 2 décimales, vous pouvez essayer quelque chose comme cela
si vous souhaitez supprimer le dernier 0 où la sortie est de 3,6 vous pourriez faire
OriginalL'auteur MethodMan
OriginalL'auteur John