System.Decimal раундов по заданию - PullRequest
1 голос
/ 09 апреля 2010

Может кто-нибудь объяснить, почему я получаю следующие результаты?

Dim badDecimal As Decimal = 54.50327999999999 
Dim expectedDecimal As Decimal = CDec("54.50327999999999")

badDecimal = 54.50328D, тогда как ожидаемый десятичный = 54.50327999999999D. Насколько я понимаю, что badDecimal должен содержать значение ОжидаемоеДесятичное (тот факт, что ожидается, что ожидаемое значение может содержать правильное значение, указывает на то, что тип Десятичный имеет точность для хранения значения).

Заранее благодарим за любую помощь.

1 Ответ

6 голосов
/ 09 апреля 2010

Согласно этой странице: Десятичный тип данных (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
...