C # Convertit l'objet en Decimal
Je suis en train de convertir un objet avec la valeur 0.39999999999999997
à une variable décimale sans perdre la précision.
object d = 0.39999999999999997;
J'ai essayé les méthodes suivantes.
decimal val1 = Convert.ToDecimal(d); //val1 = 0.4
object val2 = Convert.ChangeType(d, Type.GetType("System.Decimal")); //val2 = 0.4
decimal val3 = decimal.Parse(d.ToString()); //val3 = 0.4
decimal val4 = (Decimal) d; //val4 = 0.4
Je sais que ce n'est pas un problème avec le type de données décimal ne pas être en mesure de stocker cette valeur, comme illustré ci-dessous.
decimal val5 = 0.39999999999999997m; //val5 = 0.39999999999999997;
Comment puis-je convertir cet objet à la décimale sans perdre la précision?
Je suis en utilisant .NET Framework 3.5 si ce qui compte.
source d'informationauteur Chathura W
Vous devez vous connecter pour publier un commentaire.
Je pense que c'est le code que vous cherchez:
Pour que cela fonctionne, vous devez l'affecter de la même façon
Il n'existe aucun moyen pour l'objet de maintenir la précision, à moins que vous y forcer. (Si ce n'est pas le code, vous aurez besoin de montrer que la façon dont ses attribué)
C'est alors seulement que quelque chose comme ce serait le travail
decimal dec = Convert.ToDecimal(d);
Comme vous êtes la lecture de données à partir de la base de données(comme vous l'avez noté dans l'un des commentaires de l'OMI, vous devriez avoir ajouté que, dans votre question), je pense que c'est une idée terrible pour permettre la conversion à double et à l'arrière lors de la lecture de base de données, parce que vous allez perdre de la précision [probablement, il est stocké en tant que point fixe ou un numéro de système qui peut représenter décimales].
Je pense que vous devez faire un effort pour lire les valeurs stockées directement sous forme de décimales(modifier votre schéma ou quelque chose comme ça), ou si il n'est pas possible, puis de les lire comme des chaînes de caractères, et l'utilisation de Décimales.Parse() pour obtenir les valeurs réelles.
Réellement votre numéro de 0.39999999999999997 a 17 décimales par conséquent, il ne peut pas être stockée en tant que double en toute sécurité.
P. S. Il y a un excellent article concernant .net Doubles et arrondi écrit par Jon Skeet.
Decimal d = new Decimal(d);
si d est un double, alors d'après la documentation MSDN cela devrait maintenir la précision.
sur cette page http://msdn.microsoft.com/en-us/library/364x0z75(v=vs. 80).aspx il est écrit "Sans le suffixe m, le nombre est considéré comme un double"
Et ce code
montre
System.Double
tandis que celui-ci
montre
System.Decimal
Si vous êtes juste de perdre votre précision, sans le suffixe m.
objet d = 0.399999999999999999999999997 M;
travaillerait vous.
Au sérieux tout ce que vous avez à faire est de quelque chose comme cela...