2010-07-20 15 views

risposta

8

Decimal Floating Point articolo su Wikipedia con link specifico per questo articolo su System.Decimal.

Un decimale è memorizzato in 128 bit, anche se solo 102 sono strettamente necessari. È conveniente considerare il decimale come tre interi a 32 bit che rappresentano la mantissa e quindi un intero che rappresenta il segno e l'esponente. Il bit superiore dell'ultimo intero è il bit di segno (nel modo normale, con il bit impostato (1) per i numeri negativi) ei bit 16-23 (i bit bassi della parola alta a 16 bit) contengono l'esponente. Gli altri bit devono essere tutti chiari (0). Questa rappresentazione è quella data da decimal.GetBits (decimal) che restituisce una matrice di 4 ints.

+0

L' l'articolo collegato è stato utile; questo Mr. Skeet sembra una fonte affidabile di domande relative a C#. Ha molti articoli penetranti. –

+7

lanciare nuovi SomeOneDoesntKnowJonSkeetException(); –

+1

@Jouke: non c'è bisogno di un blocco 'try/catch', non verrà mai lanciato. –

0

Da "CLR via C#" 3rd Edition di J.Richter:

Un valore virgola mobile a 128 bit ad alta precisione comunemente usato per calcoli finanziari in cui errori di arrotondamento non può essere tollerato. Di 128 bit, 1 bit rappresenta il segno del valore, 96 bit rappresentano il valore stesso, e 8 bit rappresentano potenza di 10 per dividere la 96-bit valore (può essere ovunque da 0 a 28). I bit rimanenti sono inutilizzati.

1

Come descritto a pagina Struttura decimale di MSDN http://msdn.microsoft.com/en-us/library/system.decimal(VS.80).aspx:

La rappresentazione binaria di un valore decimale rappresentato da un segno 1 bit, un numero intero 96 bit, e una scala fattore utilizzato per dividere il numero intero a 96 bit e specificare quale parte di esso è una frazione decimale. Il fattore di scala è implicitamente il numero 10, elevato a un esponente compreso tra 0 e 28. Pertanto, la rappresentazione binaria di un valore decimale è del modulo, ((da -296 a 296)/10 (da 0 a 28)), dove -296-1 è uguale a MinValue e 296-1 è uguale a Valore massimo.

Il fattore di ridimensionamento mantiene anche tutti gli zero finali in un numero decimale. Gli zeri finali non influiscono sul valore di un numero decimale nelle operazioni aritmetiche o di confronto . Tuttavia, gli zero finali possono essere rivelati dal metodo ToString se viene applicata una stringa di formato appropriata .

0

La parola chiave decimale indica un tipo di dati a 128 bit.

Source

La rappresentazione binaria di un valore decimale è costituito da un segnale a 1 bit, un numero intero di 96 bit, e un fattore di scala utilizzato per dividere il numero intero a 96 bit e specificare parte di esso è una frazione decimale. Il fattore di scala è implicitamente il numero 10, elevato a un esponente compreso tra 0 e 28. Pertanto, la rappresentazione binaria di un valore decimale è nella forma, ((da -296 a 296)/10 (da 0 a 28)), dove -296-1 è uguale a MinValue e 296-1 è uguale a MaxValue.

Source

0

Dal C# Language Specifications:

Il tipo decimal è un tipo di dati a 128 bit adatto per i calcoli finanziari e monetari.
Il tipo decimal può rappresentare valori compresi tra 1.0 × 10 -28 a circa 7.9 × 10 con 28-29 cifre significative.

L'insieme finito di valori di tipo decimal sono di forma (-1) s × c × 10 - e, dove il segno s è 0 o 1, la coefficiente c è data da 0 ≤ c , e la scala e è tale che 0 ≤ e ≤ 28.
Il tipo decimal non supporta zeri firmati, infiniti o NaN. A decimal viene rappresentato come un intero a 96 bit ridimensionato di una potenza di dieci. Per i decimali con un valore assoluto inferiore a 1,0 m, il valore è esatto al 28 o posizione decimale, ma non oltre.

Per i decimali con un valore assoluto maggiore o uguale a 1,0 m, il valore è esatto a 28 o 29 cifre. Contrariamente ai tipi di dati float e double, i numeri decimali decimali come 0,1 possono essere rappresentati esattamente nella rappresentazione decimale. Nelle rappresentazioni float e double, tali numeri sono spesso frazioni infinite, rendendo tali rappresentazioni più soggette a errori di arrotondamento.

Se uno degli operandi di un operatore binario è di tipo decimal, l'altro operando deve essere di tipo integrale o di tipo decimal. Se è presente un operando di tipo integrale, viene convertito in decimal prima che l'operazione venga eseguita.

Il risultato di un'operazione sui valori di tipo decimal è quello che risulterebbe dal calcolo di un risultato esatto (scala di conservazione, come definito per ciascun operatore) e quindi arrotondamento per adattarsi alla rappresentazione. I risultati sono arrotondati al valore rappresentativo più vicino e, quando un risultato è ugualmente vicino a due valori rappresentabili, al valore che ha un numero pari nella posizione di cifra meno significativa (questo è noto come "arrotondamento bancario"). Un risultato zero ha sempre un segno di 0 e una scala di 0.

Se un'operazione decimale aritmetica produce un valore inferiore o uguale a 5 × 10 -29 in valore assoluto, il risultato dell'operazione diventa zero . Se un'operazione decimale aritmetica produce un risultato troppo grande per il formato decimal, viene generato un valore System.OverflowException.

Il tipo decimal ha una precisione maggiore ma un intervallo inferiore rispetto ai tipi a virgola mobile. Pertanto, le conversioni dai tipi a virgola mobile a decimal potrebbero produrre eccezioni di overflow e le conversioni da decimal ai tipi a virgola mobile potrebbero causare una perdita di precisione. Per questi motivi, non esistono conversioni implicite tra i tipi a virgola mobile e decimal, e senza i cast espliciti, non è possibile combinare operandi in virgola mobile e decimal nella stessa espressione.

Problemi correlati