decimale vs doppio!- Quale usare e come?[duplica]
Domanda
A questa domanda ha già una risposta qui:
- Quando devo usare il doppio invece di decimale? 12 risposte
Continuo a vedere persone che utilizzano raddoppia in C#.So che l'ho letto da qualche parte che raddoppia a volte perde di precisione.La mia domanda è quando dovrebbe utilizzare una doppia e quando devo usare un tipo decimal?Che tipo è adatto per i soldi calcoli?(ie.superiore a 100 milioni di dollari)
Soluzione
Per soldi, sempre decimale. E 'il motivo per cui è stato creato.
Se i numeri devono aggiungere correttamente o di equilibrio, usare decimale. Ciò include qualsiasi stoccaggio finanziaria o calcoli, colonne sonore, o ad altri numeri che la gente potrebbe fare a mano.
Se il valore esatto dei numeri non è importante, utilizzare il doppio per la velocità. Questo include la grafica, fisica o altri calcoli scienze fisiche in cui v'è già un "numero di cifre significative".
Altri suggerimenti
La mia domanda è quando dovrebbe un uso un doppia e quando devo usare un decimale digitare?
decimal
per quando si lavora con i valori nella gamma di 10 ^ (+/- 28) e dove si hanno aspettative circa il comportamento sulla base di base di 10 rappresentazioni -. Fondamentalmente denaro
double
per quando è necessario relativa precisione (cioè perdere in precisione le cifre di trascinamento sui valori di grandi dimensioni non è un problema) attraverso selvaggiamente diverse grandezze - copre double
più di 10 ^ (+/- 300) . calcoli scientifici sono l'esempio migliore qui.
quale tipo è adatto per i soldi calcoli?
decimale, decimale , decimale
Accetta sostituti.
Il fattore più importante è che double
, essendo implementato come una frazione binaria, non possono rappresentare accuratamente numerose frazioni decimal
(come 0,1) a tutti e il suo numero complessivo di cifre è minore poiché è 64- bit wide vs 128 bit per decimal
. Infine, applicazioni finanziarie spesso devono seguire specifiche arrotondamento modalità (a volte obbligatorio per legge). decimal
supporta queste ; double
non lo fa.
Sistema.Singolo / galleggiante - 7 cifre
Sistema.Doppio / doppio - 15-16 cifre
Sistema.Decimale / decimale - 28-29 cifre significative
Io sono stato colpito da utilizzando il tipo sbagliato (un bel po ' di anni fa) con i grandi importi:
- £520,532.52 - 8 cifre
- £1,323,523.12 - 9 cifre
Si esegue fuori 1 milione di euro per un mobile.
A 15 cifre del valore monetario:
- £1,234,567,890,123.45
9 miliardi di dollari con un letto matrimoniale.Ma con la divisione e il confronto è più complicato (io sicuramente non sono un esperto in virgola mobile e numeri irrazionali - vedere Marc punto).Miscelazione decimali e raddoppia causa problemi:
Una operazione matematica o di confronto che utilizza un numero a virgola mobile potrebbe non produrre lo stesso risultato se un numero decimale viene utilizzato in quanto il numero a virgola mobile potrebbe non esattamente approssimativa decimale numero.
Quando devo usare il doppio invece di decimale? ha una struttura simile e più in profondità le risposte.
Utilizzando double
invece di decimal
monetaria applicazioni è un micro-ottimizzazione - che è il più semplice modo in cui mi guarda.
decimale è per i valori esatti. Doppio è per i valori approssimativi.
USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)
Per i soldi: decimal
. Il costo è un po 'più di memoria, ma non ha problemi di arrotondamento come double
ha a volte.
Sicuramente tipi uso interi per i vostri calcoli di denaro. Questo non può essere sottolineata a sufficienza, dato che a prima vista potrebbe sembrare che un tipo in virgola mobile è adeguata.
Ecco un esempio in codice Python:
>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0
sembra piuttosto normale.
Ora provate di nuovo con 10 ^ 20 dollari dello Zimbabwe
>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0
Come si può vedere, il dollaro è scomparso.
Se si utilizza il tipo integer, funziona benissimo:
>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1
Credo che la differenza principale accanto larghezza po 'è che ha base decimale esponente di 10 e doppio ha 2
http: // software-prodotto- development.blogspot.com/2008/07/net-double-vs-decimal.html