Согласно этой странице: Десятичный тип данных (Visual Basic) , вам необходимо добавить суффикс десятичных литеральных значений к верхнему регистру символа D
, в противном случае компилятор попытается скомпилировать его соответствующим образом, но другой, числовой тип, например Целое число , Длинное , Двойное и т. д., в зависимости от используемого постоянного значения.
В вашем случае код в основном выглядит следующим образом:
Dim badDecimal As Decimal = (constant of type System.Double)
И, таким образом, уже во время компиляции значение константы утратило свою точность.
Просто измените код на это:
Dim badDecimal As Decimal = 54.50327999999999D
^
+-- add this
и должно работать как положено.
Тем не менее, я бы устал ожидать, что две переменные будут сравниваться одинаково, у StackOverflow достаточно вопросов о «проблемах» с типами с плавающей запятой, чтобы хотя бы заставить вас сказать, что у вас может быть незначительный Разница в N-й десятичной дроби, достаточно мала, чтобы не попасть на дисплей или в отладчик, но достаточно, чтобы две переменные сравнивались по-разному.
Так что имейте в виду, что если вы собираетесь сравнивать их, типичный способ - вычесть одно значение из другого, взять его абсолютное значение и сравнить его с каким-то незначительным значением, чтобы сказать: «Я принимаю другое, такое большое, но не больше ".
т. как это:
If Math.Abs(badDecimal - expectedDecimal) < 0.000001 Then
вместо этого:
If badDecimal = expectedDecimal Then