Tipo de dados decimal (Visual Basic)

Mantém valores de 128 bits (16 bytes) assinados que representam números inteiros de 96 bits (12 bytes) elevados a uma potência variável de 10. O fator de colocação em escala especifica o número de dígitos à direita do ponto decimal; varia de 0 a 28. Com uma escala de 0 (sem casas decimais), o maior valor possível é +/-79.228.162.514.264.337.593,543.950.335 (+/-7.9228162514264337593543950335E+28). Com 28 casas decimais, o maior valor é +/-7,9228162514264337593543950335, e o menor valor diferente de zero é +/-0,0000000000000000000000000001 (+/-1E-28).

Comentários

O tipo de dados Decimal fornece o maior número de dígitos significativos para um número. Ele suporta até 29 dígitos significativos e pode representar valores superiores a 7,9228 x 10^28. Ele é particularmente adequado para cálculos, como financeiros, que exigem um grande número de dígitos, mas não toleram erros de arredondamento.

O valor padrão de Decimal é 0.

Dicas de programação

  • Precisão. Decimal não é um tipo de dados de ponto flutuante. A estrutura Decimal contém um valor inteiro binário, junto com um bit de sinal e um fator de escala inteiro que especifica qual parte do valor é uma fração decimal. Por isso, os números Decimal têm uma representação mais precisa na memória do que tipos de ponto flutuante (Single e Double).

  • Desempenho. O tipo de dados Decimal é o mais lento de todos os tipos numéricos. Você deve avaliar a importância da precisão em relação ao desempenho antes de escolher um tipo de dados.

  • Ampliação. O tipo de dados Decimal é ampliado para Single ou Double. Isso significa que você pode converter Decimal para qualquer um desses tipos sem encontrar um erro System.OverflowException.

  • Zeros à direita. O Visual Basic não armazena zeros à direita em um literal Decimal. No entanto, uma variável Decimal preserva todos os zeros à direita adquiridos computacionalmente. O exemplo a seguir ilustra essa situação.

    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))
    

    A saída de MsgBox no exemplo anterior é a seguinte:

    d1 = 2.375, d2 = 1.625, d3 = 4.000, d4 = 4
    
  • Caracteres de tipo. Acrescentar o caractere de tipo literal D a um literal o força ao tipo de dados Decimal. Acrescentar o caractere de tipo identificador @ a qualquer identificador o força ao tipo Decimal.

  • Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura System.Decimal.

Intervalo

Talvez seja necessário usar o caractere do tipo D para atribuir um valor grande a uma variável ou constante Decimal. Esse requisito ocorre porque o compilador interpreta um literal como Long, a menos que um caractere de tipo literal siga o literal, como mostra o exemplo a seguir.

Dim bigDec1 As Decimal = 9223372036854775807   ' No overflow.
Dim bigDec2 As Decimal = 9223372036854775808   ' Overflow.
Dim bigDec3 As Decimal = 9223372036854775808D  ' No overflow.

A declaração de bigDec1 não produz um estouro porque o valor atribuído a ela está dentro do intervalo de Long. O valor Long pode ser atribuído à variável Decimal.

A declaração para bigDec2 gera um erro de estouro porque o valor atribuído a ela é muito grande para Long. Como o literal numérico não pode ser interpretado primeiro como um Long, ele não pode ser atribuído à variável Decimal.

Para bigDec3, o caractere de tipo literal D resolve o problema forçando o compilador a interpretar o literal como Decimal em vez de Long.

Confira também