Come rappresentare la valuta o il denaro in C

TL; DR 1 Qual è un approccio accurato e gestibile per rappresentare valuta o denaro in C?


Sfondo della domanda:
Questo è stato risposto per un certo numero di altre lingue, ma non sono riuscito a trovare una risposta solida per il linguaggio C.

Nota: ci sono molte altre domande simili per altre lingue, ne ho solo alcune per scopi di rappresentazione.

Tutte queste domande possono essere ridotte a “utilizzare un tipo di dati decimal ” in cui il tipo specifico può variare in base alla lingua.

C’è una domanda correlata che finisce per suggerire l’uso di un approccio a “punto fisso”, ma nessuna delle risposte risponde usando un tipo di dati specifico in C.

Allo stesso modo, ho esaminato librerie di precisione arbitrarie come GMP , ma non mi è chiaro se questo sia l’approccio migliore da usare o meno.


Semplificando ipotesi:

  • Presume un’architettura basata su x86 o x64, ma si prega di richiamare tutte le ipotesi che potrebbero avere un impatto su un’architettura basata su RISC come un chip di potenza o un chip di arm.

  • La precisione nei calcoli è il requisito principale. La facilità di manutenzione sarebbe il prossimo requisito. La velocità dei calcoli è importante, ma è terziaria rispetto agli altri requisiti.

  • I calcoli devono essere in grado di supportare in modo sicuro le operazioni accurate per il mulino , nonché i valori di supporto che vanno fino ai trilioni (10 ^ 9)


Differenze da altre domande:

Come notato sopra, questo tipo di domanda è stato chiesto prima per più lingue. Questa domanda è diversa dalle altre domande per un paio di motivi.

Utilizzando la risposta accettata da: Perché non utilizzare Double o Float per rappresentare la valuta? , evidenziamo le differenze.

( Soluzione 1 ) Una soluzione che funziona praticamente in qualsiasi lingua è quella di utilizzare numeri interi invece e contare centesimi. Ad esempio, 1025 sarebbero $ 10,25. Diverse lingue hanno anche tipi built-in per gestire i soldi. ( Soluzione 2 ) Tra gli altri, Java ha la class BigDecimal e C # ha il tipo decimale.

Enfasi aggiunta per evidenziare le due soluzioni suggerite

La prima soluzione è essenzialmente una variante dell’approccio “punto fisso”. C’è un problema con questa soluzione in quanto l’intervallo suggerito (centesimi di inseguimento) è insufficiente per i calcoli basati sul mulino e le informazioni significative andranno perse durante l’arrotondamento.

L’altra soluzione è usare una class decimal nativa che non è disponibile in C.

Allo stesso modo, la risposta non considera altre opzioni come la creazione di una struttura per la gestione di questi calcoli o l’uso di una libreria arbitraria di precisione. Queste sono comprensibili differenze poiché Java non ha strutture e perché considerare una libreria di terze parti quando esiste un supporto nativo all’interno della lingua.

Questa domanda è diversa da quella domanda e altre domande correlate perché C non ha lo stesso livello di supporto del tipo nativo e ha caratteristiche linguistiche che le altre lingue non hanno. E non ho visto nessuna delle altre domande affrontare i molteplici modi in cui questo potrebbe essere affrontato in C.


La domanda:
Dalla mia ricerca, sembra che float non sia un tipo di dati appropriato da utilizzare per rappresentare la valuta all’interno di un programma C a causa dell’errore in virgola mobile.

Cosa dovrei usare per rappresentare il denaro in C, e perché questo approccio è migliore di altri approcci?

1 Questa domanda è iniziata in forma più breve, ma il feedback ricevuto ha indicato la necessità di chiarire la domanda.