Domanda Differenza tra decimale, float e doppio in .NET?


Qual è la differenza tra decimal, float e double in .NET?

Quando qualcuno userebbe uno di questi?


1771
2018-03-06 11:31


origine


risposte:


float e double siamo galleggiante binario tipi di punti. In altre parole, rappresentano un numero come questo:

10001.10010110011

Il numero binario e la posizione del punto binario sono entrambi codificati all'interno del valore.

decimal è un galleggiante decimale tipo di punto. In altre parole, rappresentano un numero come questo:

12345.65789

Di nuovo, il numero e la posizione del decimale punto sono entrambi codificati all'interno del valore - questo è ciò che rende decimal è ancora un tipo a virgola mobile invece di un tipo a virgola fissa.

La cosa importante da notare è che gli umani sono usati per rappresentare non interi in una forma decimale e aspettarsi risultati esatti in rappresentazioni decimali; non tutti i numeri decimali sono esattamente rappresentabili in virgola mobile binario - 0.1, per esempio - quindi se si utilizza un valore in virgola mobile binario si otterrà in realtà un'approssimazione a 0,1. Avrai comunque delle approssimazioni quando usi un punto decimale flottante - il risultato della divisione 1 per 3 non può essere rappresentato esattamente, per esempio.

Per quanto riguarda cosa usare quando:

  • Per valori che sono "decimali naturalmente esatti" è buono da usare decimal. Questo di solito è adatto a qualsiasi concetto inventato dall'uomo: i valori finanziari sono l'esempio più ovvio, ma ce ne sono anche altri. Prendi in considerazione il punteggio dato ai subacquei o ai pattinatori sul ghiaccio, ad esempio.

  • Per i valori che sono più artefatti della natura che non possono essere realmente misurati Esattamente Comunque, float/double sono più appropriati. Ad esempio, i dati scientifici sarebbero solitamente rappresentati in questa forma. Qui, i valori originali non saranno "decimamente accurati" per iniziare, quindi non è importante che i risultati attesi mantengano la "precisione decimale". I tipi di punti binari mobili sono molto più veloci da utilizzare rispetto ai decimali.


1963
2018-03-06 11:56



La precisione è la principale differenza.

Galleggiante - 7 cifre (32 bit)

Doppio-15-16 cifre (64 bit)

Decimale -28-29 cifre significative (128 bit)

I decimali hanno una precisione molto più elevata e vengono solitamente utilizzati all'interno di applicazioni finanziarie che richiedono un alto grado di precisione. I decimali sono molto più lenti (fino a 20 volte in alcuni test) di un doppio / float.

I decimali e i galleggianti / i doppi non possono essere confrontati senza un cast mentre Floats and Doubles possono. I decimali consentono anche la codifica o gli zeri finali.

float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);

Risultato:

float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333

894
2018-03-06 11:33



La struttura decimale è strettamente orientata ai calcoli finanziari che richiedono accuratezza, che sono relativamente intolleranti agli arrotondamenti. I decimali non sono adeguati per le applicazioni scientifiche, tuttavia, per diversi motivi:

  • Una certa perdita di precisione è accettabile in molti calcoli scientifici a causa dei limiti pratici del problema fisico o del manufatto misurato. La perdita di precisione non è accettabile in finanza.
  • Decimale è molto (molto) lento di galleggiante e doppia per la maggior parte delle operazioni, principalmente perché le operazioni a virgola mobile sono fatte in binario, che roba decimale è fatto in base 10 (cioè float e double sono gestite dall'hardware FPU, come MMX / SSE , mentre i decimali sono calcolati nel software).
  • Decimal ha un intervallo di valori inaccettabilmente più piccolo del doppio, nonostante il fatto che supporti più cifre di precisione. Pertanto, Decimal non può essere utilizzato per rappresentare molti valori scientifici.

65
2018-04-13 13:55



enter image description here

per maggiori informazioni puoi andare al sorgente di questa immagine:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/921a8ffc-9829-4145-bdc9-a96c1ec174a5


54
2018-06-07 12:50



float 7 cifre di precisione

double ha circa 15 cifre di precisione

decimal ha circa 28 cifre di precisione

Se hai bisogno di una precisione migliore, usa il doppio invece del float. Nelle moderne CPU entrambi i tipi di dati hanno quasi le stesse prestazioni. L'unico vantaggio dell'uso del galleggiante è che occupano meno spazio. Praticamente conta solo se ne hai molti.

Ho trovato questo è interessante. Quello che ogni scienziato informatico dovrebbe sapere sull'aritmetica virgola mobile


39
2017-08-29 00:06



Nessuno l'ha menzionato

Nelle impostazioni predefinite, Floats (System.Single) e double (System.Double) non verranno mai utilizzati   controllo di overflow mentre Decimal (System.Decimal) verrà sempre utilizzato   controllo di overflow.

intendo

decimal myNumber = decimal.MaxValue;
myNumber += 1;

getta OverflowException.

Ma questi non lo fanno:

float myNumber = float.MaxValue;
myNumber += 1;

&

double myNumber = double.MaxValue;
myNumber += 1;

28
2018-01-02 13:12



  1. Double e float possono essere divisi per zero intero senza eccezioni sia in fase di compilazione che in fase di esecuzione.
  2. Il decimale non può essere diviso per zero intero. La compilazione fallirà sempre se lo fai.

24
2017-07-29 07:21