tipo - money type sql to c#
¿Cuál es el mejor tipo de datos para usar con dinero en c#? (9)
¿Cuál es el mejor tipo de datos para usar con dinero en c #?
Como se describe en el 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 .
Puedes usar un decimal de la siguiente manera:
decimal myMoney = 300.5m;
Crea tu propia clase. Esto parece extraño, pero un tipo .Net es inadecuado para cubrir diferentes monedas.
De acuerdo con el patrón del dinero: el manejo de las monedas es demasiado engorroso cuando usas decimales.
Si crea una clase de moneda, puede poner toda la lógica relacionada con el dinero allí, incluido el método correcto ToString (), más control de los valores de análisis y mejor control de las divisiones.
Además, con una clase de moneda, no hay posibilidad de mezclar involuntariamente dinero con otros datos.
Decimal. Si eliges el doble te estás dejando abierto a errores de redondeo.
El decimal tiene un rango más pequeño, pero una mayor precisión, ¡por lo que no perderá todos esos centavos con el tiempo!
Todos los detalles aquí:
La mayoría de las aplicaciones con las que he trabajado usan decimal
para representar dinero. Esto se basa en el supuesto de que la aplicación nunca se ocupará de más de una moneda.
Este supuesto puede basarse en otro supuesto, que la aplicación nunca se utilizará en otros países con monedas diferentes. He visto casos donde eso resultó ser falso.
Ahora, esta suposición se está desafiando de una manera nueva: las nuevas monedas como Bitcoin son cada vez 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 deba admitir múltiples monedas.
Algunas personas dirán que crear o incluso usar un tipo solo por dinero es "chapado en oro" o agregar complejidad adicional más allá de los requisitos conocidos. Estoy totalmente en desacuerdo. Cuanto más ubicuo sea un concepto dentro de su dominio, más importante es hacer un esfuerzo razonable para usar la abstracción correcta desde el principio. 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 que es posible que se introduzcan defectos en el código existente, y la mejor parte es que esos defectos probablemente impliquen cantidades de dinero, transacciones con dinero o simplemente cualquier cosa con dinero.
Y no es tan difícil usar algo que no sea decimal. "Tipo de dinero nuget" de Google y verá que muchos 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
.
Otra opción (especialmente si está lanzando 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". Así que "en los bordes" necesitará algo de "* 10000" en el camino de entrada y algo de "/ 10000" en el camino de salida. Este es el mecanismo de almacenamiento utilizado por el servidor SQL de Microsoft, consulte http://msdn.microsoft.com/en-au/library/ms179882.aspx
La sutileza de esto es que toda su suma se puede hacer usando aritmética de enteros (rápida).
Utilice el patrón de Money de Patterns of Enterprise Application Architecture ; especifique la cantidad como decimal y la moneda como una enumeración.
El tipo de valor decimal representa números decimales que van desde positivo 79,228,162,514,264,337,593,543,950,335 a negativo 79,228,162,514,264,337,593,543,950,335. El tipo de valor decimal es apropiado para los cálculos financieros que requieren grandes números de dígitos integrales y fraccionarios significativos y sin errores de redondeo. El tipo decimal no elimina la necesidad de redondear. Más bien, minimiza los errores debido al redondeo.
Me gustaría señalar esta excelente respuesta de zneak sobre por qué no se debe usar el doble.