Conversion d'un nombre décimal en nombre double en C# entraîne une différence

Résumé du problème:

Pour des valeurs décimales, lorsque nous convertir le type de décimal à double, une petite fraction est ajouté à la suite.

Ce qui est pire, c'est qu'il peut y avoir deux "égalité" des valeurs décimales qui sont le résultat de différentes valeurs double lors de la conversion.

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 du débogueur regarder.
Les chiffres qui produisent cet effet ont beaucoup moins de chiffres après la virgule que la limite des types de données, de sorte qu'il ne peut pas être un dépassement de capacité (je suppose!).

Ce qui le rend beaucoup plus intéressant, c'est qu'il peut y avoir deux égal les valeurs après la virgule (dans l'exemple de code ci-dessus, voir "dcm" et "dcm2", avec "deltaDcm" égal à zéro) résultant de différentes double des valeurs lors de la conversion. (Dans le code, "dbl" et "dbl2", qui n'est pas nulle "deltaDbl")

J'imagine que ça doit être quelque chose lié à la différence de la bit-à-bit de la représentation des nombres dans les deux types de données, mais ne peut pas comprendre ce qui! Et j'ai besoin de savoir quoi faire pour faire de la conversion de la manière dont j'ai besoin c'est d'être. (comme dcm2 -> dbl2)

  • J'ai signalé ce problème sur MS Connecter. Voici le lien: connect.microsoft.com/VisualStudio/feedback/...
  • Je ne suis pas sûr de ce qui est la raison, mais il semble que le problème est dans l' (6) un grand nombre de décimales. J'ai testé avec 5 décimales et fonctionne très bien. J'ai même scénario où je transformer un nombre décimal en double et en arrière, et depuis ma précision n'est que de 2 décimales, mon code est sûr converti.
InformationsquelleAutor Iravanchi | 2009-10-18