2017-10-17 52 views
0

Jetez un oeil au code C#:Le formatage d'une valeur décimale .NET est différente en fonction de la façon dont il a été créé

decimal value1 = 1234M; 
decimal value2 = 1234.00M; 
Console.WriteLine(value1 == value2); // True 
Console.WriteLine(value1);   // 1234 
Console.WriteLine(value2);   // 1234.00 

Quels sont qui les amènent à formater différemment les différences entre value1 et value2 (différent nombre de décimales)?

Ils sont des valeurs égales, donc j'attendre à ce qu'ils seraient formatés de la même manière. Est-ce que value2 stocke en quelque part quelque part que je l'ai créé avec deux décimales? Si oui, comment puis-je voir cela et changer cela?

+2

décimal est un peu spécial, il est capable de garder une trace du nombre de chiffres significatifs de la valeur . Flotteur très différent et double. Donc, si vous ne spécifiez pas le nombre de chiffres que vous voulez dans la fraction, elle affichera autant de chiffres qu'elle le sait. –

+0

"Je m'attendrais à ce qu'ils soient formatés de la même manière" De quelle façon vous attendez-vous? Vous attendez-vous à ce qu'il ajoute des chiffres significatifs à la première valeur ou les supprime de la seconde? –

+0

@ DStanley Si deux valeurs sont égales, je pense qu'elles devraient se comporter de la même manière. Je ne m'inquiète pas vraiment comment ils sont formatés tant qu'ils sont cohérents. C'est juste inattendu; il me semble que je n'ai aucun moyen de savoir comment une valeur décimale sera formatée jusqu'à ce que je le fasse réellement. Si cela ne tenait qu'à moi, je ferais en sorte que la mise en forme par défaut fonctionne de la même manière que les types à virgule flottante - en supprimant tous les zéros non significatifs. –

Répondre

1

En interne, la décimale est stockée en tant que type de nombre à virgule flottante. Elle stocke donc la mantisse et l'exposant. Dans votre cas, les deux numéros sont stockés différemment, quelque chose à peu près comme:

decimal value1 = 1234M; 
// mantissa = 1234, exponent = 0 

decimal value2 = 1234.00M;  
// mantissa = 123400, exponent = 2 

Lorsque la sortie, il semble que .NET vous donne obtenez la mantisse « tout » avec un point décimal positionné selon l'exposant.

+0

Est-il possible d'obtenir la valeur de la mantisse et la valeur de l'exposant d'une manière ou d'une autre? Mon problème est que ces valeurs sont deux choses différentes qui se comportent différemment, et je devrais être capable de détecter qu'elles ne sont pas identiques. Si 'value1' se comporte d'une certaine façon et' value2' se comporte d'une autre façon, ce ne sont pas des valeurs égales pour moi. –

+0

Mathématiquement, 1234 et 1234.00 sont égaux. Le type de données est une abstraction représentant un nombre, et les nombres sont égaux. Si vous souhaitez déterminer si la représentation sous-jacente de la valeur dans la mémoire est la même, vous vous trouvez sur un chemin différent de la plupart des personnes utilisant le type de données décimal. Donc je ne pense pas qu'il y ait un opérateur simple qui puisse tester cela. Vous pouvez cependant vous plonger dans la représentation interne de la valeur - voir cette réponse ici https://stackoverflow.com/a/3801462/22194 – codeulike

+0

Ou si vous utilisez un 'float', je pense qu'il est normalisé, ce qui signifie que les internes sont gérés de sorte que 1234 et 1234.00 seraient stockés de la même manière. – codeulike

1

Votre façon de procéder a ajouté une précision différente dans votre valeur décimale.

C'est la même valeur, mais pas le même format

Un sujet similaire a été rapporté ici: Adjusting decimal precision, .net

+0

Merci pour cela, je savais qu'il devait être quelque part sur Stack Overflow, je ne pouvais pas le trouver. En outre, [cette réponse] (https://stackoverflow.com/a/7983330/108374) est une solution intéressante à ce problème. –

+0

Vous êtes les bienvenus –