2012-06-18 6 views
5

Attualmente sto imparando C++ e questo mi è appena venuto in mente. Sono solo curioso di questo perché sto sviluppando un semplice programma bancario. Userò double per calcolare dollari/tasso di interesse ecc., Ma ci sono alcune piccole differenze tra i calcoli del computer e i calcoli umani.Se float e double non sono precisi, come fanno le banche a eseguire calcoli accurati che coinvolgono denaro?

Immagino che quelle .più extra nel mondo reale possano fare la differenza!

+3

controlla http://stackoverflow.com/questions/149033/best-way-to-store-currency-values-in-c –

+0

Grazie molte informazioni su quella pagina! –

+0

Vedere anche http://introcs.cs.princeton.edu/java/91float/, che descrive questo problema in dettaglio per gli studenti CS. – jvriesem

risposta

12

In molti casi, i calcoli finanziari vengono eseguiti utilizzando l'aritmetica a virgola fissa anziché il virgola mobile.

Ad esempio, il tipo .NET Decimal o il tipo VB6 Currency. Questi sono in pratica solo tipi interi, in cui tutti hanno concordato che le unità sono una frazione di un centesimo, come $ 0,0000.

E sì, alcuni arrotondamenti devono verificarsi, ma sono fatti in modo molto sistematico. Di solito le regole di arrotondamento sono da qualche parte nella stampa fine del tuo contratto (il tasso di interesse è x%, composto ogni T, arrotondato al centesimo più vicino, ma non inferiore a $ y ogni periodo di dichiarazione).

+0

Sono d'accordo, calcoli molto accurati per le coordinate di gioco sono spesso fatti anche con calcoli interi. I calcoli in virgola mobile presentano sempre un certo livello di errori di arrotondamento. –

+0

Non ci ho pensato in quel modo, evviva. Sto dando un'occhiata all'aritmetica in virgola fissa. Un altro pensiero che si è verificato è se le banche usano arrotondamenti a loro favore e se generano enormi quantità di profitti (dato un gran numero di transazioni che si verificano in ogni momento). –

+2

@Kurzon: le transazioni "ordinarie" non hanno errori di arrotondamento, poiché quando trasferisco $ 1,23 a te, il mio saldo scende esattamente di 123c' e il tuo sale esattamente di 123c': il punto fisso prende cura di esso. Si applica a cose come interessi e commissioni, dove si moltiplica una quantità di denaro di una percentuale che potrebbe avere un sacco di cifre decimali. Ma come Ben dice che le regole sono definite da un contratto o da una legge da qualche parte. Se sei un trader ad alta velocità, forse ti interessano le regole di arrotondamento. Altri clienti probabilmente non così tanto. –

0

Solo perché un numero non è un numero intero non significa che non può essere calcolato esattamente. Considera che un valore in dollari e centesimi è un numero intero se si conta il numero di centesimi (centesimi), quindi è una questione semplice per una libreria a virgola fissa che utilizza due decimali di precisione per moltiplicare semplicemente ogni numero per 100, eseguire il calcolo come numero intero e quindi dividere nuovamente per 100.

1

La gamma di un lungo 8 byte è lungo: -9223372036854775808 max: 9223372036854775807 fare tutto come migliaia di un centesimo/centesimo e non è ancora possibile gestire i numeri fino ai bilioni di dollari/sterline/qualunque cosa.

1

Dipende dall'applicazione. richiede arrotondamenti quando vengono emessi come dollari e centesimi (o qualunque sia la valuta locale): il prezzo base di un articolo può avere solo due cifre dopo il decimale, ma quando si aggiunge l'imposta sulle vendite o IVA, ci sarà di più, e se è necessario calcolare gli interessi su un investimento, ci sarà di più.

In generale, utilizzando double risultati nei risultati più accurati, però ... se il software viene utilizzato per una sorta di contabilità richiesto dalla legge (ad esempio, ai fini fiscali), si può essere richiesto di seguire di serie pratiche di arrotondamento accettate, e queste sono basate sul decimale aritmetico, non binario, esadecimale o ottale (che sono le solite basi per il punto mobile — binario è universale su tutto ma i mainframe ). In questi casi, è necessario utilizzare una classe Decimal , che garantisce l'arrotondamento corretto. Per altri usi (ad esempio l'analisi del rischio ), double va bene.

Problemi correlati