Проблема со всеми этими типами заключается в том, что существует определенная неточность
И что эта проблема может возникнуть с маленькими десятичными числами, как в следующем примере
Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1
If fMean - fDelta < fLimit Then
bLower = True
Else
bLower = False
End If
Вопрос: Какое значение содержит переменная bLower?
Ответ: На 32-битной машине bLower содержит ИСТИНА !!!
Если я заменю Double на Decimal, bLower содержит FALSE, что является хорошим ответом.
В двойном, проблема в том, что fMean-fDelta = 1,09999999999, что ниже, чем 1,1.
Внимание: я думаю, что та же самая проблема, безусловно, может существовать для другого числа, потому что десятичная дробь - это всего лишь двойное число с большей точностью, а точность всегда имеет предел.
Фактически, Double, Float и Decimal соответствуют двоичному десятичному числу в COBOL!
К сожалению, другие числовые типы, реализованные в COBOL, не существуют в .Net. Для тех, кто не знает COBOL, существует в COBOL следующий числовой тип
BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte)