2011-09-20 3 views
2

La comparaison d'égalité pour les types décimaux C# est-elle plus susceptible de fonctionner comme nous le prévoyons intuitivement que les autres types de virgule flottante?Égalité de type décimal C#

Répondre

5

Je suppose que cela dépend de votre intuition. Je supposerais que certaines personnes penseraient au résultat de diviser 1 par 3 comme la fraction 1/3, et d'autres penseraient plus sur les lignes de "Oh, 1 divisé par 3 ne peut pas être représenté comme un nombre décimal, nous Je vais devoir décider combien de chiffres garder, allons avec 0,333 ".

Si vous pensez de la première façon, Decimal ne vous aidera pas beaucoup, mais si vous pensez de la manière suivante, et que vous avez explicitement besoin d'arrondir lorsque c'est nécessaire, il est plus probable que les opérations soient "intuitivement" arrondir les erreurs en décimales, par exemple en divisant par 10, se comportera comme prévu. Ceci est plus intuitif pour la plupart des gens que le comportement d'un type binaire à virgule flottante, où les puissances de 2 se comportent bien, mais pas les puissances de 10.

+0

-1 Comme ce n'est pas vraiment répondre à la question, sauf pour ressasser ma réponse précédente. – Noldorin

+0

@Noldorin - Je ne suis pas d'accord sur le fait qu'il s'agit d'une reprise, car votre réponse ne couvre pas le problème que l'arithmétique binaire n'est pas intuitive pour la plupart. En outre, je ne suis pas d'accord avec votre réponse «non» à la question de l'égalité étant plus susceptible de fonctionner comme prévu. Ne pas dire utiliser l'égalité est une bonne idée, mais regardez par exemple. le nombre d'utilisateurs Javascript confus sur divers sites web qui ont des problèmes dû au type de nombre étant binaire –

+0

Cela n'a rien à voir avec être intuitif ... C'est simplement la représentation interne et la façon d'arrondir est faite, que je discute et cite de MSDN . Meh. – Noldorin

4

Fondamentalement, non. Le type Decimal représente simplement un type spécialisé de nombre à virgule flottante conçu pour réduire l'erreur d'arrondi spécifiquement dans le système de base 10. Autrement dit, la représentation interne d'un Decimal est en fait en base 10 (denary) et non le binaire habituel. Par conséquent, c'est un type plutôt approprié pour les calculs monétaires - bien que cela ne soit pas limité à de telles applications.

De l'MSDN page pour la structure:

Le type de valeur décimale représente un nombre décimal allant de 79.228.162.514.264.337.593.543.950.335 positive à 79.228.162.514.264.337.593.543.950.335 négative. Le type Valeur décimale est approprié pour les calculs financiers nécessitant un grand nombre de chiffres entiers et fractionnaires significatifs et aucune erreur d'arrondi. Le type décimal n'élimine pas le besoin d'arrondir. Au contraire, il minimise les erreurs dues à l'arrondissement. Par exemple, le code suivant produit un résultat de 0,9999999999999999999999999999 au lieu de 1.

Un nombre décimal est une valeur à virgule flottante composée d'un signe, d'une valeur numérique où chaque chiffre de la valeur est compris entre 0 et 9, et un facteur d'échelle qui indique la position d'un point décimal flottant qui sépare les parties intégrale et fractionnaire de la valeur numérique.

+0

Ahem. Down-vote pourquoi? Cette réponse est parfaitement correcte merci. – Noldorin