C# Convertir.ToDouble() perd des points décimaux lors de la conversion de chaîne à double
Disons que nous avons le code simple suivant
string number = "93389.429999999993";
double numberAsDouble = Convert.ToDouble(number);
Console.WriteLine(numberAsDouble);
après que la conversion numberAsDouble
variable a la valeur 93389.43. Que puis-je faire pour faire de cette variable maintenir l'ensemble du numéro est sans arrondi? J'ai trouvé que Convert.ToDecimal
ne se comportent pas de la même manière, mais j'ai besoin d'avoir la valeur double.
-------------------petite mise à jour---------------------
mettre un point d'arrêt à la ligne 2 du code ci-dessus montre que la numberAsDouble variable a la valeur arrondie 93389.43 avant de s'afficher dans la console.
IIRC, est analyse
Merci de voir si les réponses précédentes aide - stackoverflow.com/questions/tagged/... ...
Pourquoi avez-vous comme un double?
j'ai besoin de passer la valeur en tant que double, d'une bibliothèque pour effectuer d'autres calculs
Cette bibliothèque n'est pas en mesure d'être plus précis avec un
number
correctement, cependant, il est affiché comme un arrondi de la valeur lors de l'impression. Insérer un point d'arrêt et le confirmer. J'ai peut-être tort, bien que, d'où le commentaire.Merci de voir si les réponses précédentes aide - stackoverflow.com/questions/tagged/... ...
Pourquoi avez-vous comme un double?
j'ai besoin de passer la valeur en tant que double, d'une bibliothèque pour effectuer d'autres calculs
Cette bibliothèque n'est pas en mesure d'être plus précis avec un
double
que votre code sera.OriginalL'auteur Giorgos Manoltzas | 2013-01-15
Vous devez vous connecter pour publier un commentaire.
93389.429999999993
ne peut pas être représenté exactement en 64 bits, nombre à virgule flottante. Undouble
ne peut contenir que 15 ou 16 chiffres, alors que vous avez 17 chiffres. Si vous avez besoin de ce niveau de précision lors de l'utilisation d'undecimal
à la place.(Je sais vous vous dites que vous besoin comme un double, mais si vous pouviez expliquer pourquoi, il y a peut être des solutions de rechange)
Vous gagnez; Bravo!
OriginalL'auteur D Stanley
Ce comportement est normal.
Un double ne peut pas représenter chaque nombre exactement. Cela n'a rien à voir avec la chaîne de conversion.
Vous pouvez vérifier par vous même:
Cette impression sera
93389.43
.La suite le montre aussi:
Ce imprime
True
.OriginalL'auteur Daniel Hilgarth
Garder à l'esprit qu'il y a deux conversions se passe ici. D'abord vous êtes de la conversion de la chaîne en double, et puis vous êtes de la conversion double en arrière dans une chaîne de caractères à afficher.
Vous devez également considérer qu'un
double
n'ont pas une précision infinie; selon la chaîne, certaines données peuvent être perdues en raison du fait qu'un double n'ont pas la capacité à stocker.Lors de la conversion d'un double, il ne va pas "rond", pas plus qu'elle ne l'a d'. Il va créer le double de ce qui est le plus proche du nombre prévu, étant donné les capacités d'un double. Lors de la conversion, qui double à une chaîne, il est beaucoup plus probable que certaines informations ne sont pas conservées.
OriginalL'auteur Servy
Voir la suite (en particulier la première partie de Michael Borgwardt réponse):
décimal vs double! - Qui dois-je utiliser et quand?
Un double ne sera pas toujours garder de la précision en fonction du nombre que vous tentez de convertir
Si vous avez besoin pour être plus précis, vous aurez besoin d'utiliser
decimal
OriginalL'auteur NinjaNye
C'est une limite à la précision qu'un
double
peut stocker. Vous pouvez voir vous-même en essayant de convertir3389.429999999993
à la place.OriginalL'auteur Bobson
La
double
type a une précision limitée de 64 bits, une erreur d'arrondi se produit lorsque le nombre réel est stocké dans le numberAsDouble variable.Une solution qui pourrait fonctionner pour votre exemple est l'utilisation de la
decimal
type, au lieu, qui dispose de 128 bits de précision. Cependant, le même problème se pose avec une petite différence.Pour arbitraire grand nombre, le
System.Numerics.BigInteger
objet de l' .NET Framework 4.0 prend en charge une précision arbitraire pour les entiers. Cependant, vous aurez besoin d'un 3ème partie de la bibliothèque de l'utilisation arbitraire de grands nombres réels.OriginalL'auteur J-Mik
Vous pourrait tronquer le nombre de décimales à la quantité de chiffres dont vous avez besoin, n'excédant pas le double de la précision.
Par exemple, ce sera tronquée à 5 décimales, se 93389.42999. Il suffit de remplacer 100000 pour la valeur nécessaire
OriginalL'auteur Esteban Elverdin