Question

J'ai un code, et je ne comprends pas. Je développe une application qui est une précision très importante. mais il ne important pour .NET, pourquoi? Je ne sais pas.

double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());

mais la boîte de message affiche: 3.5 S'il vous plaît aidez-moi, merci.

Était-ce utile?

La solution

Vous pouvez avoir une précision, mais cela dépend de ce que vous voulez faire. Si vous mettez ce qui suit dans une application console:

double a = 1e-20;
Console.WriteLine(" a  = {0}", a);
Console.WriteLine("1+a = {0}", 1+a);

decimal b = 1e-20M;
Console.WriteLine(" b  = {0}", b);
Console.WriteLine("1+b = {0}", 1+b);

Vous obtiendrez

 a  = 1E-20
1+a = 1
 b  = 0,00000000000000000001
1+b = 1,00000000000000000001

Notez que la fonction Pow, comme presque tout dans la classe Math, ne prend en double:

double Pow(double x, double y);

Vous ne pouvez pas prendre le Sine d'une décimale (autre puis en le convertissant en double)

Voir aussi cette question.

Autres conseils

Si vous faites quoi que ce soit où la précision est très importante, vous devez être conscient des limites de la virgule flottante. Une bonne référence est « Ce que tout informaticien David Goldberg devrait savoir sur Virgule flottante Arithmétique « .

Vous pouvez constater que virgule flottante ne vous donne pas assez de précision et vous devez travailler avec un type décimal. Ceux-ci, cependant, sont toujours beaucoup plus lent que virgule flottante - c'est un compromis entre la précision et la vitesse

.

La précision d'un Double est de 15 chiffres (17 chiffres en interne). La valeur que vous calculez est correct avec Math.Pow, mais quand vous l'ajoutez à juste est value trop petit pour faire une différence.

Edit:
Une décimal peut gérer cette précision, mais pas le calcul. Si vous voulez que la précision, vous devez faire le calcul, puis convertir chaque valeur à un avant de les ajouter Decimal ensemble:

double value = 3.5;
double small = Math.Pow(10, -20);

Decimal result = (Decimal)value + (Decimal)small;

MessageBox.Show(result.ToString());

Ou utilisez le décimal plutôt que de type double.

Double précision signifie qu'il peut contenir 15-16 chiffres. 3,5 + 1e-20 = 21 chiffres. Il ne peut pas être représenté dans le double precicion. Vous pouvez utiliser un autre type comme décimal.

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