Tipo di dati Decimal (Visual Basic)
Contiene valori Signed a 128 bit (16 byte) che rappresentano numeri di tipo Integer a 96 bit (12 byte) scalati in base a una potenza variabile di 10. Il fattore di ridimensionamento specifica il numero di cifre a destra del separatore decimale; varia da 0 a 28. Con una scala pari a 0 (nessuna posizione decimale), il valore massimo possibile è +/-79.228.162.514.264.337.593.5 43.950.335 (+/-7.9228162514264337593543950335E+28). Con 28 posizioni decimali, il valore più grande è +/-7.9228162514264337593543950335 e il valore diverso da zero più piccolo è +/-0.0000000000000000000000000001 (+/-1E-28).
Osservazioni:
Il tipo di dati Decimal
fornisce il maggior numero di cifre significative per un numero. Supporta fino a 29 cifre significative e può rappresentare valori superiori a 7,9228 x 10^28. È particolarmente adatto per i calcoli, ad esempio quelli finanziari, che richiedono un numero elevato di cifre, ma non possono tollerare errori di arrotondamento.
Il valore predefinito di Decimal
è 0.
suggerimenti per la programmazione
Precisione.
Decimal
non è un tipo di dati a virgola mobile. La strutturaDecimal
contiene un valore intero binario, insieme a un bit più significativo e a un fattore di ridimensionamento integer che specifica quale parte del valore è una frazione decimale. Per questo motivo, i numeriDecimal
hanno una rappresentazione più precisa in memoria rispetto ai tipi a virgola mobile (Single
eDouble
).Prestazioni. Il tipo di dati
Decimal
è il più lento di tutti i tipi numerici. È consigliabile valutare l'importanza della precisione rispetto alle prestazioni prima di scegliere un tipo di dati.Ampliamento. Il tipo di dati
Decimal
può essere convertito inSingle
oDouble
senza riscontrare un errore di System.OverflowException. Tuttavia, questa conversione può comportare perdita di precisione, poichéSingle
eDouble
prioritizzano accomodare valori più grandi rispetto a preservare la precisione.
Dim decimalValue As Decimal = 1234567890123456789012345D
Dim doubleValue As Double = CDbl(decimalValue)
Console.WriteLine("Decimal value: " & decimalValue)
Console.WriteLine("Double value: " & doubleValue)
L'output dell'esempio precedente mostra che il valore decimale mantiene la precisione completa, mentre il valore Double perde la precisione a causa delle limitazioni del tipo di dati Double
.
Decimal value: 1234567890123456789012345
Double value: 1.23456789012346E+24
Zro finali. Visual Basic non archivia gli zeri finali in un valore letterale
Decimal
. Tuttavia, una variabileDecimal
mantiene tutti gli zeri finali acquisiti in modo computazionale. Ciò è illustrato nell'esempio seguente.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))
L'output di
MsgBox
nell'esempio precedente è il seguente:d1 = 2.375, d2 = 1.625, d3 = 4.000, d4 = 4
Caratteri tipo. Aggiungendo il carattere di tipo letterale
D
a un valore letterale, se ne determina la conversione nel tipo di datiDecimal
. Aggiungendo il carattere identificatore di tipo@
a qualsiasi identificatore, se ne determina la conversione al tipo di datiDecimal
.Tipo di framework. Il tipo corrispondente in .NET Framework è la struttura System.Decimal.
Intervallo
Potrebbe essere necessario usare il carattere di tipo D
per assegnare un valore di grandi dimensioni a una variabile Decimal
o a una costante. Questo requisito è dovuto al fatto che il compilatore interpreta un valore letterale come Long
a meno che un carattere di tipo letterale non segua il valore letterale, come illustrato nell'esempio seguente.
Dim bigDec1 As Decimal = 9223372036854775807 ' No overflow.
Dim bigDec2 As Decimal = 9223372036854775808 ' Overflow.
Dim bigDec3 As Decimal = 9223372036854775808D ' No overflow.
La dichiarazione per bigDec1
non produce un overflow perché il valore assegnato è compreso nell'intervallo per Long
. Il valore Long
può essere assegnato alla variabile Decimal
.
La dichiarazione per bigDec2
genera un errore di overflow perché il valore assegnato è troppo grande per Long
. Poiché il valore letterale numerico non può essere prima interpretato come Long
, non può essere assegnato alla variabile Decimal
.
Per bigDec3
, il carattere di tipo letterale D
risolve il problema forzando il compilatore a interpretare il valore letterale come Decimal
anziché come Long
.