c# - tipo - decimal vs doble!-¿Cuál debo usar y cuándo?
type double c# (7)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cuándo debo usar el doble en lugar del decimal? 12 respuestas
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
Creo que la principal diferencia al lado del ancho de bits es que el decimal tiene una base de exponente 10 y el doble tiene 2
http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html
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