In C#, quale tipo di dati devo utilizzare per rappresentare gli importi monetari? Decimale? Galleggiante? Doppio? Voglio prendere in considerazione: la precisione, l'arrotondamento, eccQuale tipo di dati dovrei utilizzare per rappresentare denaro in C#?
risposta
Uso System.Decimal
:
Il tipo di valore decimale rappresenta numeri decimali che vanno dal positivo 79.228.162.514.264.337.593.543.950.335 a negativo 79.228.162.514.264.337.593.543.950.335. Il tipo di valore decimale è appropriato per i calcoli finanziari richiedono gran numero di cifre integrali e frazionari significative e non arrotondamento errori. Il tipo decimale non elimina la necessità di arrotondare. Piuttosto, riduce al minimo gli errori dovuti all'arrotondamento .
Né System.Single
(float
) né System.Double
(double
) sono abbastanza preciso grado di rappresentare alta precisione numeri in virgola mobile senza errori di arrotondamento.
Decimal è quello che si desidera.
Utilizzare decimale e denaro nel DB se si utilizza SQL.
In C#, il tipo Decimale è in realtà una struttura con funzioni sovraccariche per tutte le operazioni matematiche e di confronto nella base 10, quindi avrà errori di arrotondamento meno significativi. Un float (e double), d'altra parte è simile alla notazione scientifica in binario. Di conseguenza, i tipi decimali sono più accurati quando si conosce la precisione necessaria.
Esegui questo per vedere la differenza nella precisione del 2:
using System;
using System.Collections.Generic;
using System.Text;
namespace FloatVsDecimal
{
class Program
{
static void Main(string[] args)
{
Decimal _decimal = 1.0m;
float _float = 1.0f;
for (int _i = 0; _i < 5; _i++)
{
Console.WriteLine("float: {0}, decimal: {1}",
_float.ToString("e10"),
_decimal.ToString("e10"));
_decimal += 0.1m;
_float += 0.1f;
}
Console.ReadKey();
}
}
}
considerare l'uso della Money Type for the CLR. È un tipo di valore personalizzato (struct) che supporta anche valute e gestisce l'arrotondamento dei problemi.
Nessun README, documenti e PR non separati di 2 anni fa ... –
Stavo leggendo il libro "Codice adattivo tramite C#" (dal 2014) e si dice: "non è consigliabile utilizzare il tipo decimale per rappresentano i valori di valuta (...) .Si dovrebbe invece usare un tipo di valore Money (url same come sopra) .Sono confuso perché mi è sempre stato detto di usare decimal L'autore non spiega perché non dovremmo usa il decimale Basandomi su quello e su quello che George ha scritto, immagino che decimale sia la strada da percorrere. – Marshall
In C# È necessario prendere "Decimale" per rappresentare importi monetari.
- 1. Quale tipo di dati dovrei utilizzare per memorizzare i valori monetari?
- 2. Quale tipo di dati dovrei utilizzare per i codici lingua IETF?
- 3. Quale tipo di dati dovrei utilizzare per memorizzare un GUID nei dati principali?
- 4. Best practice per rappresentare denaro (valore + valuta) in Grails
- 5. Quale tipo MIME dovrei usare per mp3
- 6. Quale tipo di struttura dati dovrei utilizzare per contenere le righe della tabella?
- 7. Quale tipo di dati utilizzare per numeri molto grandi in C++?
- 8. Quale tipo di dati utilizzare per manipolare la valuta
- 9. Quale tipo booleano dovrei usare in iOS/Objective-C?
- 10. Come utilizzare il tipo di dati in denaro in Java, SQL, ORM
- 11. Quale struttura dati dovrei usare per la classe BigInt
- 12. Quale classe usare per la rappresentazione del denaro?
- 13. Quale tipo di dati del server sql rappresenta meglio un doppio in C#?
- 14. Quale conoscenza di C# dovrei avere?
- 15. Quale tipo di dati utilizzare in MySQL per memorizzare le immagini?
- 16. Quale tipo utilizzare per memorizzare una tabella di dati mutabili in memoria in Scala?
- 17. C# che tipo di eccezione dovrei aumentare?
- 18. Django: Come dovrei memorizzare un valore in denaro?
- 19. C# quale eccezione dovrei aumentare qui?
- 20. Come rappresentare i soldi in Objective-C/iOS?
- 21. Quale approccio alla modellazione in C# dovrei prendere?
- 22. Quale tipo di dati dovresti usare in C++ quando lavori con blocchi di dati binari?
- 23. Quale tipo usare per una variabile di timeout in C++?
- 24. Quale struttura dati utilizzare nel mio esempio
- 25. per rappresentare un grande decimale in java
- 26. Quale tipo di dati da utilizzare per memorizzare le autorizzazioni utente
- 27. Quale origine dati aggregata dovrei utilizzare per Spring 3.1.0, Hibernate 4.0.1.Final e MySQL 5.1?
- 28. Rappresentare un tipo limitato senza utilizzare una classe
- 29. Quale tipo di dati per latitudine e longitudine?
- 30. quale algoritmo dovrei usare?
Ho svalutato questo problema, ma sono contrario al reclamo finale. Non è che float/double non sono abbastanza precisi - è solo che usano una base inadeguata per soldi. Si potrebbe avere un valore di punto binario mobile a 512 bit con una * precisione * più effettiva del decimale, ma non sarebbe comunque appropriato in quanto non può rappresentare esattamente valori decimali come 0.1 esattamente. –
Mio errore - ho un significato misto nella mia risposta. Nella mia affermazione finale ho usato "preciso" per non significare "precisione matematica", ma piuttosto per esprimere che un numero arrotondato (1 in questo esempio) è "meno preciso" di (0.99999_) quando il numero assegnato alla variabile era in effetti 0.9999_. Scarsa scelta di parole da parte mia ... –
Sì, anche un float è _precise_ sufficiente. Il problema si presenta quando si converte da decimale a binario e viceversa. Le due basi differenti hanno serie diverse di numeri irrazionali. – Nosredna