Résumé du problème :
Pour certaines valeurs décimales, lorsque nous convertissons le type de décimal en double, une petite fraction est ajoutée au résultat.
Le pire, c'est qu'il peut y avoir deux valeurs décimales "égales" qui donnent des valeurs doubles différentes lorsqu'elles sont converties.
Exemple de code :
decimal dcm = 8224055000.0000000000m; // dcm = 8224055000
double dbl = Convert.ToDouble(dcm); // dbl = 8224055000.000001
decimal dcm2 = Convert.ToDecimal(dbl); // dcm2 = 8224055000
double dbl2 = Convert.ToDouble(dcm2); // dbl2 = 8224055000.0
decimal deltaDcm = dcm2 - dcm; // deltaDcm = 0
double deltaDbl = dbl2 - dbl; // deltaDbl = -0.00000095367431640625
Regardez les résultats dans les commentaires. Les résultats sont copiés à partir de la montre du débogueur. Les nombres qui produisent cet effet ont beaucoup moins de chiffres décimaux que la limite des types de données, donc il ne peut pas s'agir d'un débordement (je suppose !).
Ce qui rend la chose encore plus intéressante, c'est qu'il peut y avoir deux égal des valeurs décimales (dans l'exemple de code ci-dessus, voir "dcm" et "dcm2", avec "deltaDcm" égal à zéro), ce qui se traduit par différents valeurs doubles lors de la conversion. (Dans le code, "dbl" et "dbl2", qui ont un "deltaDbl" non nul).
Je suppose que cela doit être lié à une différence dans la représentation binaire des nombres dans les deux types de données, mais je n'arrive pas à trouver quoi ! Et j'ai besoin de savoir ce qu'il faut faire pour que la conversion se fasse comme je le souhaite. (comme dcm2 -> dbl2)