Qual è il miglior tipo di dati da utilizzare in denaro in c #?

Qual è il miglior tipo di dati da utilizzare in denaro in c #?

Come descritto al decimale come:

La parola chiave decimale indica un tipo di dati a 128 bit. Rispetto ai tipi a virgola mobile, il tipo decimale ha più precisione e un intervallo più piccolo, il che lo rende appropriato per i calcoli finanziari e monetari .

È ansible utilizzare un decimale come segue:

 decimal myMoney = 300.5m; 

System.Decimal

Il tipo di valore decimale rappresenta numeri decimali che vanno da 79.228.162.514.264,337,593,543,550,335 a un valore negativo di 79,228,162,514,264,337,593,543,950,335. Il tipo di valore decimale è appropriato per i calcoli finanziari che richiedono un numero elevato di cifre integrali e frazionarie significative e nessun errore di arrotondamento. Il tipo decimale non elimina la necessità di arrotondare. Piuttosto, riduce al minimo gli errori dovuti all’arrotondamento.

Vorrei puntare a questa eccellente risposta di Zneak sul perché il doppio non dovrebbe essere usato.

Utilizzare il modello Money da Patterns of Enterprise Application Architecture ; specificare l’importo come decimale e la valuta come enum.

Decimale. Se scegli il doppio, ti stai lasciando aperto agli errori di arrotondamento

il decimale ha un intervallo più piccolo, ma una precisione maggiore – in modo da non perdere tutti quei centesimi nel tempo!

Tutti i dettagli qui:

http://msdn.microsoft.com/en-us/library/364x0z75.aspx

D’accordo con il modello di Money: Gestire le valute è troppo ingombrante quando si usano i decimali.

Se crei una class di valuta, puoi quindi inserire tutte le logiche relative al denaro, incluso un corretto metodo ToString (), un maggiore controllo dei valori di analisi e un migliore controllo delle divisioni.

Inoltre, con una class di valuta, non vi è alcuna possibilità di mescolare involontariamente denaro con altri dati.

Un’altra opzione (specialmente se si sta eseguendo il rollover della propria class) consiste nell’usare un int o un int64 e designare le quattro cifre inferiori (o eventualmente anche 2) come “a destra del punto decimale”. Quindi “ai bordi” avrete bisogno di alcuni “* 10000” per entrare e alcuni “/ 10000” per l’uscita. Questo è il meccanismo di archiviazione utilizzato da Microsoft SQL Server, vedere http://msdn.microsoft.com/en-au/library/ms179882.aspx

La cosa migliore è che tutta la tua sumtoria può essere eseguita usando l’aritmetica (veloce) intera.

Crea la tua class. Questo sembra strano, ma un tipo .Net è inadeguato per coprire diverse valute.

La maggior parte delle applicazioni con cui ho lavorato utilizza il decimal per rappresentare il denaro. Questo si basa sul presupposto che l’applicazione non riguarderà mai più di una valuta.

Questa ipotesi può essere basata su un’altra ipotesi, che l’applicazione non verrà mai utilizzata in altri paesi con valute diverse. Ho visto casi in cui ciò si è dimostrato falso.

Ora questa ipotesi viene messa alla prova in un modo nuovo: nuove valute come Bitcoin stanno diventando più comuni e non sono specifiche per alcun paese. Non è irrealistico che un’applicazione utilizzata in un solo paese possa ancora aver bisogno di supportare più valute.

Alcune persone diranno che la creazione o addirittura l’uso di un tipo solo per soldi è la “doratura” o l’aggiunta di una complessità extra oltre ai requisiti noti. Sono fortemente in disaccordo. Più un concetto è onnipresente nel tuo dominio, più è importante fare uno sforzo ragionevole per utilizzare l’astrazione corretta in anticipo. Se vuoi vedere la complessità, prova a lavorare in un’applicazione che utilizzava i decimal e ora c’è una proprietà Currency aggiuntiva accanto a ogni proprietà decimal .

Se usi l’astrazione sbagliata in anticipo, la sostituzione successiva sarà cento volte più efficace. Ciò significa potenzialmente l’introduzione di difetti nel codice esistente e la parte migliore è che tali difetti coinvolgeranno probabilmente importi di denaro, transazioni con denaro o qualsiasi cosa con denaro.

E non è così difficile usare qualcosa di diverso dai decimali. Google “nuget money type” e vedrai che numerosi sviluppatori hanno creato tali astrazioni (incluso me). È facile. È facile come usare DateTime invece di memorizzare una data in una string .