Тип данных Decimal (Visual Basic)
Содержит 128-разрядные (16-байтовые) значения, представляющие 96-разрядные (12-байтовые) целые числа, масштабируемые переменной мощностью 10. Коэффициент масштабирования указывает число цифр справа от десятичной точки; диапазон от 0 до 28. С масштабом 0 (без десятичных разрядов), максимально возможное значение — +/-79 228 162 514 264 337 593,5543,950,335 (+/-7.922816251426433759354395033950335E+28). При 28 десятичных разрядах наибольшее значение равно +/-7.92816251426437593554395035, а наименьшее ненулевое значение — +/-0.000000000000000000000000000000000001 (+/-1E-28).
Замечания
Тип Decimal
данных предоставляет наибольшее количество значимых цифр для числа. Он поддерживает до 29 значимых цифр и может представлять значения, превышающие 7,9228 x 10^28. Он особенно подходит для вычислений, таких как финансовые, для которых требуется большое количество цифр, но не допускает округления ошибок.
Значение по умолчанию для типа Decimal
— 0.
Советы по программированию
Точность.
Decimal
не является типом данных с плавающей запятой. СтруктураDecimal
содержит двоичное целочисленное значение, а также бит знака и целочисленный коэффициент масштабирования, указывающий, какая часть значения — десятичная дробь. Из-за этогоDecimal
числа имеют более точное представление в памяти, чем типы с плавающей запятой (Single
иDouble
).Производительность. Тип
Decimal
данных является самым медленным из всех числовых типов. Перед выбором типа данных следует взвешивать важность точности в отношении производительности.Расширение. Тип
Decimal
данных расширяется доSingle
илиDouble
. Это означает, что вы можете преобразоватьDecimal
в любой из этих типов, не столкнувшись с ошибкой System.OverflowException .Конечные нули. Visual Basic не сохраняет конечные нули в литерале
Decimal
.Decimal
Однако переменная сохраняет все конечные нули, полученные вычислительным способом. Это показано в следующем примере.Dim d1, d2, d3, d4 As Decimal d1 = 2.375D d2 = 1.625D d3 = d1 + d2 d4 = 4.000D MsgBox("d1 = " & CStr(d1) & ", d2 = " & CStr(d2) & ", d3 = " & CStr(d3) & ", d4 = " & CStr(d4))
Выходные данные
MsgBox
в предыдущем примере приведены следующим образом:d1 = 2.375, d2 = 1.625, d3 = 4.000, d4 = 4
Тип символов. При добавлении к литералу символа типа литерала
D
производится принудительное приведение литерала к типу данныхDecimal
. При добавлении символа идентификатора типа@
к любому идентификатору производится принудительное приведение этого идентификатора к типуDecimal
.Тип платформы. В .NET Framework данный тип соответствует структуре System.Decimal.
Диапазон
Может потребоваться использовать D
символ типа для назначения большого значения переменной Decimal
или константе. Это требование обусловлено тем, что компилятор интерпретирует литерал как Long
если символ литерального типа не следует литералу, как показано в следующем примере.
Dim bigDec1 As Decimal = 9223372036854775807 ' No overflow.
Dim bigDec2 As Decimal = 9223372036854775808 ' Overflow.
Dim bigDec3 As Decimal = 9223372036854775808D ' No overflow.
Объявление для bigDec1
не создает переполнение, так как значение, назначенное ему, попадает в диапазон.Long
Значение Long
можно назначить переменной Decimal
.
Объявление для bigDec2
создания ошибки переполнения, так как значение, назначенное ему, слишком велико.Long
Так как числовый литерал не может быть интерпретирован в качестве Long
первого, он не может быть назначен переменной Decimal
.
Для bigDec3
этого символ D
литерального типа решает проблему, заставляя компилятора интерпретировать литерал как не Decimal
как.Long