9
votes

C #: Somme de deux problèmes de double numéros

Dupliqué possible:
Pourquoi le point flottant est-il arithmétique en C # imprécise?

Salut. J'ai suivi de problème: xxx

pour la décimale est correct: xxx

Pourquoi résultat pour le double est faux? < / p>


2 commentaires

Il y a beaucoup de questions sur la question de la double ne pas bing capable de représenter tous les chiffres. Si vous recherchez C # et double , vous en trouverez plusieurs personnes. Celui-ci est bon, par exemple: Pourquoi (double) 0.6F> (double) (double) (6 / 10f)? . En outre, L'article de Jon Skeet's vaut la peine d'être lu.


Vous n'avez pas besoin de jeter à la décimale. Il suffit d'utiliser un suffixe "m". Par exemple, 43,6 m + 61,11 m identifie les deux littéraux comme des "valeurs de type décimal".


7 Réponses :


2
votes

Parce que le double utilise un modèle fractionnaire. Tout nombre <1 est exprimé sous la forme de x / y. Compte tenu de cette information, certains chiffres ne peuvent être approchés que. Utilisez décimal, pas double pour les calculs de haute précision.

voir ici pour une lecture légère :)


2 commentaires

Les décimales sont des fractions. Le problème est que la représentation typique de la machine est une représentation binaire, qui ne peut pas représenter toutes les décimales avec une expansion finie.


Decimal est le meilleur choix pour l'argent



3
votes

Ce n'est pas vraiment faux. C'est la représentation décimale la plus proche du nombre de points flottants binaires résultant de la somme.

Le problème est que les flotteurs IEEE ne peuvent pas représenter 43,65 + 61,11, en raison de l'utilisation d'une mantisse binaire. Certains systèmes (tels que Python 2.7 et les bibliothèques d'E / S de Visual C ++ et Visual C ++) s'élèveront à la décimale la plus simple qui se résout à la même binaire et imprimera les 104,76 attendus. Mais tous ces systèmes arrivent exactement la même réponse en interne.

Il est intéressant de noter que la notation décimale peut représenter finellement une fraction binaire finie, alors que le contraire ne tient pas. Si les humains avaient deux doigts et des ordinateurs ont utilisé une mémoire de dix états, nous n'aurions pas ce problème. : -)


0 commentaires

3
votes

Réponse courte: la représentation du point flottant (telle que "double") est intrinsèquement inexacte. Donc, le point fixe (tel que «décimal»), mais l'inexactitude de la représentation à point fixe est d'un type différent. Voici une courte explication: http://effbot.org/ pyfaq / pourquoi-ont-les-points-poncts-calculs-so-inexact.htm

Vous pouvez google pour "l'inexactitude des points flottants" ou pour plus pour plus.


0 commentaires

13
votes

Cette question et ses réponses sont une richesse d'informations sur cette question - différence entre décimal, flotteur et double dans .NET?

pour citer:

  • pour les valeurs qui sont "naturellement exactes Décimales "Il est bon d'utiliser décimal. Ceci convient généralement à tout Concepts inventés par les humains: financier Les valeurs sont l'exemple le plus évident, Mais il y en a d'autres aussi. Prendre en compte score donné aux plongeurs ou aux patineurs de glace, Par exemple.

  • pour les valeurs qui sont plus d'artefacts de nature qui ne peut pas vraiment être mesurée exactement quand même, flotter / double est plus approprié. Par exemple, scientifique les données seraient généralement représentées dans ce formulaire. Ici, les valeurs d'origine ne sera pas "décimalement précis" pour commencer avec, donc ce n'est pas important pour le résultats attendus pour maintenir le "précision décimale". Flottant binaire Les types de points sont beaucoup plus rapides pour travailler avec des décimales.


0 commentaires

1
votes

arithmétique décimale est bien adapté pour base 10 représentations numériques, sous forme de nombres de base 10 peut être exactement représentés en décimal. (Ce qui est pourquoi la monnaie est toujours em> stockés dans les classes appropriées de devises, ou stockés dans int code> avec un facteur d'échelle pour représenter « centimes » ou « pence » ou autre monnaie décimale similaire. )

IEEE-754 Les nombres binaires ne peut pas calculer avec 0,1 code> ou .01 code> avec précision. flottant donc les formats de points approximative em> les entrées, et vous obtenez des sorties approximatives en arrière, ce qui est parfaitement acceptable pour quel point flottant a été conçu pour gérer em> - simulations physiques, des données scientifiques, et . méthodes mathématiques numériques rapides p>

Notez ce programme simple et sortie: p>

#include <stdio.h>

int main(int argc, char* argv[]) {
    float f, g;
    double d, e;
    long double l, m;

    f=0.1;
    g=f*f;
    d=0.1;
    e=d*d;
    l=0.1;
    m=l*l;
    printf("%40.40f, %40.40f, %40.40Lf\n", g, e, m);
    return 0;
}

$ ./fp
0.0100000007078051567077636718750000000000,
0.0100000000000000019428902930940239457414,
0.0100000000000000011102569059430467124372


1 commentaires

Numéros binaires peut représenter 0,1 ou 0.000000000000001 avec précision. Lisez à propos de la représentation à point fixe, puis reluez la représentation du point flottant, puis répondez à de telles questions.



2
votes

Cela revient au fait que des flotteurs sont stockés sous forme de flotteurs binaires et comme dans la base 10, il y a quelques chiffres qui ne peuvent pas être stockés sans troncature. Prenons pour l'exemple 1 / 3ème dans la base 10, c'est-à-dire .3 récurrente. Les chiffres que vous avez affaire, lorsqu'ils sont convertis en binaires sont récurrents.

Je suis en désaccord que les flotteurs ou les doubles sont plus ou moins précis que des représentations décimales. Ils sont aussi précis que vous choisissez d'avoir une précision. Ils constituent toutefois une représentation différente et différents numéros peuvent être exprimés entiers qu'à la base 10.

Numéros décimal stocke dans la base 10. Cela vous donnera probablement le résultat que vous attendez


0 commentaires

0
votes

vraiment? Le code ci-dessous renvoyé 104,76 comme prévu: xxx

>

Vérifiez si vous convertissez du flotteur en double qui peut avoir causé ce problème.


0 commentaires