Domanda

A questa domanda ha già una risposta qui:

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)

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top