Pregunta

Quería ver si la gente estaba usando decimal para aplicaciones financieras en lugar de doble. He visto a muchas personas usar el doble en todo el lugar con consecuencias imprevistas. .

¿Ves a otros cometer este error? . .

¿Fue útil?

Solución

Lo hicimos desafortunadamente y lo lamentamos. Tuvimos que cambiar todos los dobles a decimales. Los decimales son buenos para aplicaciones financieras. Puedes mirar este artículo Un tipo de dinero para el CLR :

  

Un dinero conveniente, de alto rendimiento   estructura para el CLR que maneja   operaciones aritméticas, tipos de moneda,   Formato y distribución cuidadosa.   y redondeo sin pérdida.

Otros consejos

Sí, usar float o double para las finanzas es un error común, que genera mucho, mucho dolor. decimal es la opción más obvia en este escenario.

Para un conocimiento general, una buena discusión de cada uno es aquí (flotante / double) y aquí (decimal).

Esto no es tan obvio como puedes pensar. Hace poco, el controlador de una gran empresa me dijo que quería que sus informes financieros coincidieran con lo que generaría Excel, que es mantener los resultados calculados internamente con la máxima precisión y solo redondearlos en el último momento para fines de visualización. Esto significa que no siempre puede hacer coincidir las respuestas de Excel mediante cálculos manuales utilizando solo los valores mostrados. Su explicación fue que había múltiples algoritmos para generar los resultados, cada uno redondeando en un lugar diferente usando valores decimales, por lo tanto, potencialmente generando respuestas conflictivas, pero el método de Excel siempre generó la misma respuesta.

Personalmente creo que está equivocado, pero con tanta gente financiera que usa Excel sin entender cómo usarlo correctamente para los cálculos financieros, apuesto a que hay mucha gente que está de acuerdo con este controlador.

No quiero iniciar una guerra religiosa, pero me encantaría escuchar otras opiniones sobre esto.

Si es " científico " Medición (me refiero a peso, longitud, área, etc.) uso doble.

Si es financiero, o tiene algo que ver con la ley (por ejemplo, el área de una propiedad), use decimal.

La parte difícil es redondear.

Si el impuesto es del 2.4%, ¿redondea en los detalles o después de la suma?

La mayoría de las veces tienes que hacer ambas cosas (Y solucionar los problemas)

Me he encontrado con esto unas cuantas veces. Muchos idiomas no tienen nada de este tipo incorporado, y para alguien que no entiende el problema, parece simplemente otra molestia, especialmente si parece que funciona como está previsto sin él.

Siempre he usado Decimal. Al menos cuando tuve un lenguaje que lo soporta. De lo contrario, los errores de redondeo te matarán.

Estoy totalmente de acuerdo con los problemas de corrección del punto flotante frente al decimal mencionado anteriormente, pero Muchas aplicaciones financieras son críticas para el rendimiento.

En tales casos, considerará usar float / double, ya que decimal tiene un gran impacto en el rendimiento en sistemas donde los tipos de decimales no son compatibles con hardware. Y aún es posible ajustar tipos de punto flotante en clases de nivel superior (por ejemplo, Impuesto, Comisión, Balance, Dividendo, Cotización, etc.) que representan el modelo de dominio y encapsulan toda la lógica de redondeo, así como operadores válidos en estos tipos y sus interacciones. Y sí, en algunos proyectos he implementado funciones de redondeo personalizadas para exprimir hasta un 20% más de los cálculos en comparación con los métodos .NET o win32.

Otra cosa a considerar es si pasa sus objetos fuera de proceso, ya que serializar decimales que generalmente son 4 enteros y pasarlos por el cable requiere mucho más CPU (especialmente si no se admite) y da como resultado un ancho de banda mucho mayor y mayor huella de memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top