decimal vs doble! - ¿Cuál debo usar y cuándo? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

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)

Author: HerbalMart, 2009-07-22

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".

 927
Author: David,
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.

 159
Author: Michael Borgwardt,
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.

 35
Author: Chris S,
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)
 32
Author: Ian Boyd,
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.

 24
Author: Clement Herreman,
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
 6
Author: Otto Allmendinger,
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

 5
Author: Honzajscz,
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