Decimal (Tipo de datos, Visual Basic)
Contiene valores de 128 bits (16 bytes) firmados que representan números enteros de 96 bits (12 bytes) escalados por una potencia variable de 10. El factor de escala especifica el número de dígitos a la derecha del separador decimal; oscila entre 0 y 28. Con una escala de 0 (sin posiciones decimales), el valor más grande posible es +/-79 228 162 514 264 337 593 543 950 335 (+/-7,9228162514264337593543950335E+28). Con 28 posiciones decimales, el valor más grande es +/-7,9228162514264337593543950335 y el valor más pequeño distinto de cero es +/-0,0000000000000000000000000001 (+/-1E-28).
Comentarios
El tipo de datos Decimal
proporciona la mayor cantidad de dígitos significativos para un número. Admite hasta 29 dígitos significativos y puede representar valores superiores a 7,9228 x 10^28. Resulta especialmente adecuado para cálculos, como financieros, que requieren una gran cantidad de dígitos pero que no pueden tolerar errores de redondeo.
El valor predeterminado de Decimal
es 0.
Sugerencias de programación
Precisión.
Decimal
no es un tipo de datos de punto flotante. La estructuraDecimal
contiene un valor entero binario, junto con un bit de signo y un factor de escala de enteros que especifica qué parte del valor es una fracción decimal. Por este motivo, los númerosDecimal
deben tener en memoria una representación más precisa que los tipos de punto flotante (Single
yDouble
).Rendimiento. El tipo de datos
Decimal
es el más lento de todos los tipos numéricos. Debe ponderar la importancia de la precisión con respecto al rendimiento antes de elegir un tipo de datos.Ampliación. El tipo de datos
Decimal
se amplía aSingle
oDouble
. Esto significa que puede convertirDecimal
en cualquiera de estos tipos sin que se produzcan un error System.OverflowException.Ceros finales. Visual Basic no almacena ceros finales en un literal
Decimal
. Sin embargo, una variableDecimal
conserva los ceros finales adquiridos mediante cálculo. Esto se ilustra en el siguiente ejemplo: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))
La salida de
MsgBox
en el ejemplo anterior es la siguiente:d1 = 2.375, d2 = 1.625, d3 = 4.000, d4 = 4
Caracteres de tipo. Al agregar el carácter de tipo literal
D
a un literal, el tipo de datos se convierte forzosamente en el tipo de datosDecimal
. Si se agrega el carácter de tipo identificador@
a cualquier identificador, se convierte forzosamente al tipoDecimal
.Tipo de Framework. El tipo correspondiente en .NET Framework es la estructura System.Decimal.
Intervalo
Es posible que tenga que usar el carácter de tipo D
para asignar un valor grande a una constante o variable Decimal
. Este requisito se debe a que el compilador interpreta un literal como Long
, a menos que un carácter de tipo literal siga el literal, tal como se muestra en el ejemplo siguiente.
Dim bigDec1 As Decimal = 9223372036854775807 ' No overflow.
Dim bigDec2 As Decimal = 9223372036854775808 ' Overflow.
Dim bigDec3 As Decimal = 9223372036854775808D ' No overflow.
La declaración de bigDec1
no genera un desbordamiento, porque el valor que tiene asignado se encuentra dentro del rango de Long
. El valor Long
se puede asignar a la variable Decimal
.
La declaración de bigDec2
genera un error de desbordamiento, porque el valor que tiene asignado es demasiado grande para Long
. Como el literal numérico no se puede interpretar primero como Long
, no se le puede asignar a la variable Decimal
.
Para bigDec3
, el carácter de tipo literal D
resuelve el problema al forzar al compilador a interpretar el literal como Decimal
en lugar de como Long
.