decimal vs doble! - ¿Cuál debo usar y cuándo? [duplicar]
Esta pregunta ya tiene una respuesta aquí:
- ¿Cuándo debo usar doble en lugar de decimal? 12 respuestas
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 debería usar un doble y cuándo debería usar un tipo decimal? ¿Qué tipo es adecuado para cálculos de dinero? (IE. superior a 100 millones de dólares)
7 answers
Para dinero, siempre decimal. Es por eso que fue creado.
Si los números deben sumar correctamente o equilibrar, use 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 double 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".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-22 14:42:15
Mi pregunta es cuándo debe un doble y cuándo debo usar un decimal tipo?
decimal
para cuando trabajas con valores en el rango de 10^(+/-28) y donde tienes expectativas sobre el comportamiento basado en representaciones de base 10 - básicamente dinero.
double
para cuando necesite precisión relativa (es decir, perder precisión en los dígitos finales en valores grandes no es un problema) a través de 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 el dinero los cálculos?
Decimal, decimal, decimal
No aceptar sustitutos.
El factor más importante es que double
, siendo implementado como una fracción binaria, no puede representar con precisión muchas decimal
fracciones (como 0.1) en absoluto y su número total de dígitos es menor ya que es de 64 bits de ancho vs. 128 bits para 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 10:18:58
Sistema.Solo / float - 7 dígitos
Sistema.Doble / doble - 15-16 dígitos
Sistema.Decimal / decimal - 28-29 dígitos significativos
La forma en que me han picado al usar el tipo incorrecto (hace unos pocos 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.
Una moneda de 15 dígitos valor:
- £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 experto en coma flotante y números irracionales - ver punto de Marc). Mezclar decimales y dobles causa problemas:
Una operación matemática o de comparación que utiliza un número de coma flotante podría no producir el mismo resultado si un número decimal se utiliza porque el es posible que el número de coma flotante no aproximar exactamente el decimal numero.
¿Cuándo debo usar doble en lugar de decimal? tiene algunas respuestas similares y más en profundidad.
Usando double
en lugar de decimal
para las aplicaciones monetarias es una microoptimización-esa es la forma más simple de verlo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:33
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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-22 14:59:57
Por dinero: decimal
. Cuesta un poco más de memoria, pero no tiene problemas de redondeo como double
a veces tiene.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 10:18:56
Definitivamente utilice tipos enteros para sus cálculos de dinero. Esto no se puede enfatizar lo suficiente, ya que a primera vista podría parecer que un tipo de coma 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
Parece bastante normal.
Ahora inténtalo de nuevo con 10^20 Zimbabwe dollars
>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0
Como pueden ver, el dólar desapareció.
Si utiliza el tipo entero, funciona bien:
>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-05 10:12:22
Creo que la principal diferencia junto al ancho de bits es que el decimal tiene un exponente base 10 y el doble tiene 2
Http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-05 10:11:36