¿Cuál es el mejor tipo de datos para usar con dinero en c #?

¿Cuál es el mejor tipo de datos para usar con dinero en c #?

Como se describe a decimal como:

La palabra clave decimal indica un tipo de datos de 128 bits. En comparación con los tipos de punto flotante, el tipo decimal tiene más precisión y un rango más pequeño, lo que lo hace apropiado para cálculos financieros y monetarios .

Puede usar un decimal de la siguiente manera:

 decimal myMoney = 300.5m; 

System.Decimal

El tipo de valor decimal representa números decimales que van desde positivos 79,228,162,514,264,337,593,543,950,335 a negativos 79,228,162,514,264,337,593,543,950,335. El tipo de valor Decimal es apropiado para cálculos financieros que requieren grandes cantidades de dígitos integrales y fraccionarios significativos y sin errores de redondeo. El tipo Decimal no elimina la necesidad de redondeo. Más bien, minimiza los errores debidos al redondeo.

Me gustaría señalar esta excelente respuesta explicando por qué no se debe usar el doble.

Utilice el patrón de dinero de Patterns of Enterprise Application Architecture ; especifique la cantidad como decimal y la moneda como una enumeración.

Decimal. Si eliges el doble, te dejas abierto a errores de redondeo

el decimal tiene un rango menor, pero con una mayor precisión, ¡para que no pierdas todos esos centavos con el tiempo!

Todos los detalles aquí:

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

De acuerdo con el patrón de Dinero: manejar monedas es demasiado engorroso cuando usas decimales.

Si crea una clase monetaria, puede poner toda la lógica relacionada con el dinero allí, incluido un método correcto ToString (), más control de los valores de análisis y un mejor control de las divisiones.

Además, con una clase Divisa, no hay posibilidad de mezclar involuntariamente dinero con otros datos.

Otra opción (especialmente si está ejecutando su propia clase) es usar un int o un int64, y designar los cuatro dígitos más bajos (o posiblemente incluso 2) como “a la derecha del punto decimal”. Entonces “en los bordes” necesitarás algunos “* 10000” al entrar y algunos “/ 10000” al salir. Este es el mecanismo de almacenamiento utilizado por el servidor SQL de Microsoft, consulte http://msdn.microsoft.com/en-au/library/ms179882.aspx

Lo bueno de esto es que toda tu sum se puede hacer usando la aritmética entera (rápida).

Crea tu propia clase. Esto parece extraño, pero un tipo .Net es inadecuado para cubrir diferentes monedas.

La mayoría de las aplicaciones con las que he trabajado usan decimal para representar el dinero. Esto se basa en el supuesto de que la aplicación nunca se ocupará de más de una moneda.

Esta suposición puede basarse en otra suposición de que la aplicación nunca se utilizará en otros países con monedas diferentes. He visto casos en los que resultó ser falso.

Ahora esa suposición está siendo desafiada de una nueva manera: las nuevas monedas como Bitcoin se están volviendo más comunes, y no son específicas de ningún país. No es poco realista que una aplicación utilizada en un solo país aún necesite admitir varias monedas.

Algunas personas dirán que crear o incluso usar un tipo solo por dinero es “dorado” o agregar complejidad adicional más allá de los requisitos conocidos. Estoy totalmente en desacuerdo. Cuanto más ubicuo es un concepto dentro de su dominio, más importante es hacer un esfuerzo razonable para usar la abstracción correcta por adelantado. Si desea ver la complejidad, intente trabajar en una aplicación que solía usar decimal y ahora hay una propiedad de Currency adicional al lado de cada propiedad decimal .

Si utiliza la abstracción incorrecta por adelantado, reemplazarla más tarde será cien veces más trabajo. Eso significa potencialmente introducir defectos en el código existente, y la mejor parte es que esos defectos probablemente implicarán cantidades de dinero, transacciones con dinero o cualquier cosa con dinero.

Y no es tan difícil usar algo que no sea decimal. Google “nuget money type” y verá que numerosos desarrolladores han creado tales abstracciones (incluyéndome a mí). Es fácil. Es tan fácil como usar DateTime lugar de almacenar una fecha en una string .