2010-05-18 8 views
8

Qual è il tuo consiglio su:Strategie comuni per gestire gli errori di arrotondamento in caso di soft ad alta intensità di valuta?

  1. compensazione di errore accumulato nelle operazioni matematiche sfuso su collezioni di oggetti di denaro. Come viene implementato nel codice di produzione per le impostazioni internazionali?
  2. teoria dietro l'arrotondamento in contabilità.
  3. qualsiasi letteratura sull'argomento.

Attualmente sto leggendo Fowler. Menziona il tipo di denaro, è una struttura tipica (int, long, BigDecimal), ma non dice nulla sulle strategie.

I post precedenti su arrotondamento del denaro (e here) non forniscono dettagli e formalità di cui ho bisogno.

I pensieri che ho trovato in inet riguardano "Round half even" come il modo migliore per bilanciare l'errore.

Grazie per l'aiuto.

+0

Se stai chiedendo informazioni sulla contabilità, dovresti chiederlo a un contabile. Hanno delle regole. Negli Stati Uniti, è il GAAP che copre questo. Hai chiesto a un ragioniere? Hai trovato le regole contabili che si applicano alle tue impostazioni locali? –

+0

@ S.Lott: Ciao, sono in Lituania. Oggi ho parlato con un impiegato della banca locale :). Mi ha detto che alla fine del mese o del trimestre hanno semplicemente cancellato la discrepanza. Ma questa risposta non si adatta alle mie esigenze. – Max

+0

Poi trova un ragioniere migliore. Sul serio. Questo è molto probabile coperto dalla legge in Lituania. Se non per legge, poi per qualche standard professionale (che è quello che il GAAP è negli Stati Uniti). Questo è ben documentato dai ragionieri. –

risposta

3

Utilizzare l'arrotondamento del banco. Arrivi al più vicino due penny.

http://www.xbeat.net/vbspeed/i_BankersRounding.htm

È possibile espandere su questo per arrotondare toward il più vicino da due soldi, invece. Quindi 22,5 colpi a 22, ma 23,5 colpi a 24. 23,1 e 22,9 entrambi intorno a 23. Tuttavia, l'algoritmo del banchiere originale è più popolare.

+0

Grazie per l'espansione. – Max

3

Non memorizzare mai valori di denaro in virgola mobile o doppia: utilizzare int o long in quanto non è possibile memorizzare 0.1 con precisione in binario.

+0

Di solito quelli int's & long e BigDecimal sono interni di Money. Ciò che è interessante è come combattere l'accumulo di errori quando si eseguono molte operazioni su Money. – Max

+3

@max: cos'è questo overflow della contabilità? ;) – Robert

+0

Che operazioni stai facendo? Le operazioni aritmetiche standard non avranno errori di arrotondamento: questo è lo scopo dell'utilizzo di una rappresentazione a virgola fissa. –

3

Tutto dipende dall'applicazione. Speriamo che non ci siano troppe situazioni in cui è richiesto l'arrotondamento. Ad esempio, il trasferimento di denaro da un account a un altro non richiede arrotondamenti.

Per le situazioni in cui è richiesto l'arrotondamento, non importa ciò che si fa finché si sceglie un criterio, lo si comunica e si attenersi ad esso. Ad esempio, credo che l'interesse sul mio conto di risparmio si riduca al centesimo più vicino.

1

ho lavorato un po '(solo un po') con importi monetari ed ero estremamente curioso di vedere la strategia utilizzata nella mia azienda ...

Si scopre che usiamo double, ma hanno Ci ho pensato.

Il problema è che le quantità con cui gestiamo non sono così grandi (diciamo meno di 10k) e al massimo abbiamo bisogno di 3 cifre dopo il decimale, per un totale di 7 cifre significative.

Dal momento che stiamo usando il software 64bit (e C++) il tipo double offre cifre significative sufficienti per il numero di operazioni che portano su di esso :)

Se avete bisogno di più precisione, ci sono gli algoritmi da utilizzare (ad esempio mentre l'aggiunta di più soldi), ma personalmente penso che il cuore del problema viene più da:

  • conversione da un denaro a un altro, che continua a cambiare, ovviamente
  • problemi di stampa, con alcuni soldi che non richiede decimale, altri richiedendo 2 al massimo, ecc ...

Forse potresti espandere le operazioni che stai facendo?

+0

Ciao, Matthieu. Ho anche visto un sistema legacy che lavora su doppio ... Abbiamo molti problemi (anche la tua conversione di denaro menzionata). Altri sono simili a quelli indicati su www.ciceuta.es/euro/doc/1/eup22en.pdf. Tipico è avere una discrepanza nella somma totale di piccoli numeri ottenuti da divisioni e moltiplicazioni. Sembra che aumenti la precisione per gli op operativi intermedi e possibilmente ricostruisca i calcoli (tuttavia parte di quei "piccoli numeri" dati non è controllata da me). Giungo alla conclusione che o ignoriamo l'errore, o compensiamo bilanciaggiando rounging come Round-half-even. – Max

5

Ci sono molti problemi di arrotondamento quando si registrano dati finanziari. primo problema è la capacità di memorizzare e recuperare i numeri decimali esatti

  • maggior parte dei database offrono tipo di dati decimali su cui è possibile specificare il numero di cifre prima e dopo il punto decimale (valute variano in numero di cifre decimali, anche, io abbiamo trattato valute con 0, 2, 3 cifre decimali)
  • quando si tratta di questi dati e si desidera evitare errori di arrotondamento imprevisti dal lato dell'applicazione è possibile utilizzare BCD come approccio generico, oppure è possibile utilizzare numeri interi per rappresentare qualsiasi notazione decimale fissa o miscela il proprio

Se questo primo problema viene risolto, nessuna aggiunta (o sottrazione) può introdurre errori di arrotondamento. Lo stesso vale per la moltiplicazione per intero.

Il secondo problema, dopo che è possibile archiviare e recuperare i dati senza perdita di informazioni, sono previsti errori di arrotondamento dovuti alla divisione (o alla moltiplicazione per non intero).

Per esempio se il formato valuta permette 2 decimali e si desidera memorizzare transazione che registra saldi un debito di 10 a 3 pezzi uguali è possibile memorizzare solo come

10.00 
-3.33 
-3.33 
-3.33 

e

-0.01 

(errore di arrotondamento)

Questo è il problema previsto che si verificherà indipendentemente dalla scelta di archiviazione del tipo di dati e che deve essere preso in considerazione se si desidera che i propri account t o equilibrio Questa situazione è principalmente introdotta dalla divisione (o dalla moltiplicazione per non interi che hanno molte cifre significative).

Un modo per risolvere questo problema è verificare se i dati sono saldi dopo tali operazioni e riconoscere la differenza di arrotondamento consentita rispetto a una situazione di errore.

MODIFICA: Per quanto riguarda i riferimenti alla letteratura, this one sembra interessante e non troppo lungo e riguarda un pubblico abbastanza ampio con scenari interessanti.

+0

Grazie per avermelo ricordato. Sì, sono sicuro che la persistenza è ok e consente decimali esatti. Generalmente il mio problema può essere distillato al punto in cui si sommano piccole somme. Peccato è che non sto controllando completamente questa ripartizione che riassumo da solo :). Quindi dovrei ricorrere al metodo Round half anche gaussiano o qualsiasi altro dato statistico ... – Max

+0

@Max, beh, la strategia su come gestire questi arrotondamenti cumulativi dipende dalle regole aziendali (a volte ti viene richiesto di fare gli importi uguali e hai per registrare l'errore, altre volte è consentito distribuire gli errori di arrotondamento). – Unreason

+0

Parlato con BA, dovremo apportare modifiche alla nostra parte e anche chiedere cambiamenti nel sistema esterno che ci nutre di questi importi "piccoli e imprecisi" di esaurimento. Comunque questo post SO è stato prezioso - almeno ho iniziato a sentire che lo staff di arrotondamento è più divertente di quanto mi sarei mai aspettato :) – Max

1

Quello che dovresti fare potrebbe essere ben informato dalle convenzioni del mercato o della giurisdizione in cui stai operando. Ad esempio, le obbligazioni di prezzo nel mercato australiano richiedono di arrotondare determinate operazioni intermedie a 8 cifre decimali.Il prezzo finale è quotato su un numero specifico di decimali (3 penso fuori dalla mia testa).

Se si ha a che fare con un'app per la contabilità, mi aspetto che gli standard contabili pertinenti per il proprio ambiente legale possano dettare questo.