Поделиться через


Тип данных 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 без возникновения ошибки System.OverflowException. Однако это преобразование может привести к потере точности, так как Single и Double принимаются во внимание большие значения, а не сохранение точности.

Dim decimalValue As Decimal = 1234567890123456789012345D
Dim doubleValue As Double = CDbl(decimalValue)

Console.WriteLine("Decimal value: " & decimalValue)
Console.WriteLine("Double value: " & doubleValue)

Выходные данные предыдущего примера показывают, что десятичное значение сохраняет полную точность, а двойное значение теряет точность из-за ограничений типа данных Double.

 Decimal value: 1234567890123456789012345
 Double value: 1.23456789012346E+24
  • Конечные нули. 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

См. также