decimal vs doble! - ¿Cuál debo usar y cuándo? [duplicar]
Sigo viendo gente usando dobles en C#. Sé que leí en alguna parte que los dobles a veces pierden precisión. Mi pregunta es ¿cuándo debo usar un tipo doble y cuándo debo usar un tipo decimal? ¿Qué tipo es adecuado para cálculos monetarios? (es decir, más de $100 millones)
Por dinero, siempre decimal. Por eso fue creado.
Si los números deben sumar correctamente o equilibrarse, utilice decimal. Esto incluye cualquier almacenamiento financiero o cálculos, puntuaciones u otros números que las personas puedan hacer a mano.
Si el valor exacto de los números no es importante, utilice el doble para mayor velocidad. Esto incluye gráficos, física u otros cálculos de ciencias físicas donde ya existe un "número de dígitos significativos".
Mi pregunta es ¿cuándo debo usar un tipo doble y cuándo debo usar un tipo decimal?
decimal
para cuando trabaja con valores en el rango de 10^(+/-28) y donde tiene expectativas sobre el comportamiento basadas en representaciones de base 10, básicamente dinero.
double
para cuando necesita precisión relativa (es decir, perder precisión en los dígitos finales en valores grandes no es un problema) en magnitudes muy diferentes: double
cubre más de 10 ^ (+/- 300). Los cálculos científicos son el mejor ejemplo aquí.
¿Qué tipo es adecuado para cálculos monetarios?
decimal, decimal , decimal
No acepte sustitutos.
El factor más importante es que double
, al implementarse como una fracción binaria, no puede representar con precisión muchas fraccionesdecimal
(como 0,1) y su número total de dígitos es menor ya que tiene 64 bits de ancho frente a los 128 bits de . Por último, las aplicaciones financieras a menudo tienen que seguir modos de redondeo específicos (a veces exigidos por ley). los apoya ; no es.decimal
decimal
double
Según las características de los tipos de punto flotante :
Tipo .NET | Palabra clave C# | Precisión |
---|---|---|
System.Single |
flotar | ~6-9 dígitos |
System.Double |
doble | ~15-17 dígitos |
System.Decimal |
decimal | 28-29 dígitos |
La forma en que me ha picado el uso del tipo incorrecto (hace unos cuantos años) es con grandes cantidades:
- 520.532,52 £ - 8 dígitos
- £1.323.523,12 - 9 dígitos
Te quedas sin 1 millón por un flotador.
Un valor monetario de 15 dígitos:
- £1.234.567.890.123,45
9 billones con un doble. Pero con la división y las comparaciones es más complicado (definitivamente no soy un experto en punto flotante y números irracionales; consulte el punto de Marc ). Mezclar decimales y dobles causa problemas:
Es posible que una operación matemática o de comparación que utilice un número de punto flotante no produzca el mismo resultado si se utiliza un número decimal porque es posible que el número de punto flotante no se aproxime exactamente al número decimal.
¿Cuándo debo usar doble en lugar de decimal? tiene algunas respuestas similares y más detalladas.
Usar double
en lugar de decimal
para aplicaciones monetarias es una microoptimización; esa es la forma más sencilla en que lo veo.