Selon cette page: Decimal Data Type (Visual Basic), vous devez suffixe valeurs littérales décimales avec le caractère majuscule D
, sinon le compilateur va essayer de le compiler comme approprié, mais différent, type numérique, comme Integer, Long, Double, etc. en fonction de la valeur constante utilisée.
Dans votre cas, le code semble essentiellement comme au compilateur:
Dim badDecimal As Decimal = (constant of type System.Double)
Et donc déjà à la compilation, la valeur constante a perdu sa précision.
changer simplement le code à ceci:
Dim badDecimal As Decimal = 54.50327999999999D
^
+-- add this
et il devrait fonctionner comme prévu.
Cependant, je serais fatigué d'attendre les deux variables à comparer identiques, il y a assez de questions sur StackOverflow sur les "problèmes" avec les types virgule flottante pour au moins me faire savoir que vous pourriez avoir une différence mineure dans la Nième décimale , assez petit pour ne pas arriver à l'affichage ou au débogueur, mais assez pour que les deux variables soient différentes. Donc, gardez cela à l'esprit si vous avez l'intention de les comparer, la manière typique est de soustraire une valeur de l'autre, prenez sa valeur absolue, et comparez cela avec une valeur minuscule pour dire "J'accepte un autre gros, mais pas plus grand ".
ie. comme ceci:
If Math.Abs(badDecimal - expectedDecimal) < 0.000001 Then
au lieu de ceci:
If badDecimal = expectedDecimal Then
Je ne sais pas tout ce que beaucoup VB.NET, mais en C# vous devez suffixe un numéro avec le caractère M pour indiquer qu'il est un nombre décimal, sinon c'est un double. Donc, avez-vous besoin de faire la même chose dans VB, de sorte qu'en fait, la première ligne assigne une valeur double (la double interprétation de 54.50327999999999) à une décimale, perdant ainsi la précision à la compilation? –
vous bel homme, c'était effectivement le problème! J'ai supposé que j'étais en train de déclarer que la variable var était de type décimal, le compilateur déduirait cela. Voulez-vous re-poster cette réponse afin que je puisse la marquer comme la solution? – WiseGuyEh
Commentaire repensé comme réponse ici: http://stackoverflow.com/questions/2606610/system-decimal-rounds-on-assignment/2606685#2606685 –