type tipo float entre diferencia dato and c# double decimal precision currency

c# - tipo - decimal vs doble!-¿Cuál debo usar y cuándo?



type double c# (7)

Esta pregunta ya tiene una respuesta aquí:

Sigo viendo gente usando dobles en C #. Sé que leo en alguna parte que los dobles a veces pierden precisión. Mi pregunta es cuándo debería usar un doble y cuándo debo usar un tipo decimal. ¿Qué tipo es adecuado para los cálculos de dinero? (es decir, más de $ 100 millones)


Mi pregunta es cuándo debería usar un 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 basado en representaciones de base 10, básicamente dinero.

double 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: el double cubre más de 10 ^ (+/- 300). Los cálculos científicos son el mejor ejemplo aquí.

¿Qué tipo es adecuado para los cálculos de dinero?

decimal decimal

No acepte sustitutos.

El factor más importante es que el double , que se implementa como una fracción binaria, no puede representar con precisión muchas fracciones decimal (como 0.1) y su número total de dígitos es menor, ya que tiene un ancho de 64 bits frente a 128 bits para el decimal . Finalmente, las aplicaciones financieras a menudo tienen que seguir modos de redondeo específicos (a veces exigidos por la ley). decimal apoya estos ; double no lo hace



El decimal es para valores exactos. Doble es para valores aproximados.

USD: $12,345.67 USD (Decimal) CAD: $13,617.27 (Decimal) Exchange Rate: 1.102932 (Double)


Por dinero, siempre decimal. Es por eso que fue creado.

Si los números deben sumarse correctamente o equilibrarse, use decimal. Esto incluye cualquier almacenamiento o cálculo financiero, puntajes u otros números que las personas puedan hacer a mano.

Si el valor exacto de los números no es importante, use el doble para la velocidad. Esto incluye gráficos, física u otros cálculos de ciencias físicas donde ya hay un "número de dígitos significativos".


Por dinero: decimal . Cuesta un poco más de memoria, pero no tiene problemas de redondeo, como el double veces tiene.


System.Single / float - 7 dígitos
System.Double / double - 15-16 dígitos
System.Decimal / decimal - 28-29 dígitos significativos

La forma en que me han picado al utilizar el tipo incorrecto (hace algunos 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 trillones con un doble. Pero con la división y las comparaciones es más complicado (definitivamente no soy experto en coma flotante ni en números irracionales, vea el punto de Marc ). Mezclar decimales y dobles causa problemas:

Una operación matemática o de comparación que usa un número de punto flotante podría no producir el mismo resultado si se usa un número decimal porque el número de punto flotante podría no aproximarse exactamente al número decimal.

¿Cuándo debo usar el doble en lugar del decimal? Tiene algunas respuestas similares y más profundas.

Usar double lugar de decimal para aplicaciones monetarias es una microoptimización, esa es la forma más simple en que lo veo.


Definitivamente use tipos enteros para sus cálculos de dinero. Esto no se puede enfatizar lo suficiente, ya que a primera vista puede parecer que un tipo de punto flotante es adecuado.

Aquí un ejemplo en código python:

>>> amount = float(100.00) # one hundred dollars >>> print amount 100.0 >>> new_amount = amount + 1 >>> print new_amount 101.0 >>> print new_amount - amount >>> 1.0

se ve bastante normal

Ahora intente esto de nuevo con 10 ^ 20 dólares de Zimbabwe

>>> amount = float(1e20) >>> print amount 1e+20 >>> new_amount = amount + 1 >>> print new_amount 1e+20 >>> print new_amount-amount 0.0

Como puedes ver, el dólar desapareció.

Si usa el tipo entero, funciona bien:

>>> amount = int(1e20) >>> print amount 100000000000000000000 >>> new_amount = amount + 1 >>> print new_amount 100000000000000000001 >>> print new_amount - amount 1