Question

En C #. J'ai un double (que j'ai extrait d'une base de données) qui a une précision de 20 chiffres. Dans Visual Studio (à l’aide de QuickWatch), la valeur du double est égale à 0,00034101243963859839.

Je souhaite afficher cette valeur dans une zone de texte, puis la redonner à la même valeur lorsque je la retire et la reconvertit en double. Mais je perds toujours les deux derniers chiffres

J'ai essayé les solutions suivantes:

double d = 0.00034101243963859839;
string s = d.ToString();
string s2 = d.ToString("F20");
string s3 = d.ToString("0.00000000000000000000"); -- 20 0's
string s4 = (d*100d).ToString();

Dans ces cas:

s  = 0.000341012439638598
s2 = 0.00034101243963859800
s3 = 0.00034101243963859800
s4 = 0.0341012439638598

Je veux pouvoir effectuer les tâches suivantes:

double d = 0.00034101243963859839;
string s = d.ToString();
//...
double d2 = double.Parse(s);
if(d == d2)
{
  //-- Success
}

Existe-t-il un moyen de conserver ces deux derniers chiffres de précision?

Était-ce utile?

La solution

Utilisez l’option " R " chaîne de format numérique :

double d = 0.00034101243963859839;
string s = d.ToString("R");
//...
double d2 = double.Parse(s);
if(d == d2)
{
  //-- Success
}

Le R signifie "aller-retour". À partir du document lié:

  

Ce format est pris en charge uniquement pour les types Simple et Double. Le spécificateur d'aller-retour garantit qu'une valeur numérique convertie en chaîne sera analysée dans la même valeur numérique.

En aparté, je suppose qu’il n’ya aucun moyen de garder ces deux derniers chiffres. La précision disponible est limitée, et je doute qu'ils aient été intégrés dans d en premier lieu. Mais vous pouvez vous assurer que votre chaîne lit au moins ce que vous avez correctement.

Si vous avez vraiment besoin de la précision supplémentaire, vous pouvez utiliser un décimal à la place.

Autres conseils

Non. Outre le fait que double est binaire et n'est donc pas bon pour les valeurs décimales, les doubles ont un maximum de 15/16 chiffres décimaux (53 bits). la virgule a un maximum de 28/29 chiffres (96 bits), donc vous pouvez l'utiliser. Si vous avez des précisions plus élevées dans la base de données, vous avez besoin d'une propre classe bignum pour C #. Recherchez des implémentations dans stackoverflow.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top