migliorabile ha scritto:
@+m+: attenzione che ti stai sbagliando.
Il BCD e' FONDAMENTALE nella gestione di quantita' monetarie...
In realtà le quantità monetarie, nei software "moderni", non vengono gestiti mediante l'implementazione BCD, ma mediante interi scalati (o double scalati), ovvero ad esempio memorizzando 100,33 nell'intero 10033, ed effettuando le divisioni per avere la versione "floating".
Spesso per la verità si utilizzano, come accennato, i double (con la stessa tecnica)
"una volta" (ma anche oggi per i vecchi programmi a 32 bit) gli interi a 64 bit (o long long) non erano tanto diffusi, mentre i compilatori moderni (e le CPU) danno supporto per interi così lunghi che puoi avere decine di migliaia di miliardi (con 5 decimali, che per quanto ne so è il limite pratico utilizzato per gli arrotondamenti) direttamente in 8 byte
Quindi è verissimo che bisogna avere particolari attenzioni nel maneggiare importi monetari, ma NON vengono utilizzati (quasi mai, per quanto ne so. E qualche gestionale l'ho visto... ) a tal fine le codifiche BCD "classiche" (se non forse per qualche buro-software COBOL)
EDIT: aggiungo che si usano diffusamente, nel caso di memorizzazione ad esempio di euro dentro double, funzioni del tipo euroarrotonda() che fa quello che uno pensa, soprattutto nelle moltiplicazioni (IVA, ritenuta etc), quindi è frequentissimo trovare pezzi di codice del tipo
iva= euroarrotonda(euroarrotonda(imponibile)*euroarrotonda(aliquota))
Aggiungo però un dettaglio: nel caso di utilizzo di campi DECIMAL con numero variabile di cifre è usuale utilizzare strutture più "furbe" di BCD, o dei BCD "superimpaccati", ad esempio mysql memorizza 9 cifre ogni 4 byte.
In breve: nei programmi che maneggiano dati a precisione fissa (es. 2, 3 o 4 decimali) è usuale utilizzare long long e double scalati; altrimenti ci sono le varie librerie più o meno evolute per memorizzare interi di lunghezza arbitraria, "superimpaccati" e così via.