Pregunta ¡decimal contra doble! - ¿Cuál debería usar y cuándo? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

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


756
2017-07-22 14:37


origen


Respuestas:


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

Si los números deben sumarse correctamente o balancearse, use decimal. Esto incluye cualquier almacenamiento financiero o cálculos, 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 cálculos de gráficos, física u otras ciencias físicas donde ya existe una "cantidad de dígitos significativos".


901
2017-07-22 14:42



Mi pregunta es cuándo debería usar un   doble y cuando debería usar un decimal   ¿tipo?

decimal para cuando trabajas con valores en el rango de 10 ^ (+/- 28) y donde tienes expectativas sobre el comportamiento basadas en representaciones de la base 10, básicamente dinero.

double para cuando lo necesites relativo la precisión (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 dinero   cálculos?

decimal, decimal, decimal

No aceptes sustitutos

El factor más importante es que double, que se implementa como una fracción binaria, no puede representar con precisión muchos decimal fracciones (como 0.1) en absoluto y su número total de dígitos es más pequeño ya que es de 64 bits de ancho frente a 128 bits de decimal. Finalmente, las aplicaciones financieras a menudo tienen que seguir específicos modos de redondeo (a veces ordenado por la ley). decimal  apoya estos; double no.


157
2017-07-22 15:12



System.Single / flotador - 7 dígitos
Sistema.Doble / doble - 15-16 dígitos
System.Decimal / decimal - 28-29 dígitos significativos

La forma en que me picó el uso del tipo incorrecto (hace unos años) es con grandes cantidades:

  • £ 520,532.52 - 8 dígitos
  • £ 1,323,523.12 - 9 dígitos

Se agota en 1 millón por una carroza.

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 números flotantes e irracionales, ver 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 coma flotante   podría no dar el mismo resultado si   número decimal se utiliza porque el   el número de punto flotante podría no   exactamente aproximar el decimal   número.

¿Cuándo debería usar el doble en lugar del decimal?tiene algunas respuestas similares y más profundas.

Utilizando double en lugar de decimal  para aplicaciones monetarias es una micro-optimización, esa es la forma más simple de verlo.


34
2018-02-04 12:06



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

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

32
2017-07-22 14:59



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


23
2017-07-22 14:39



Seguro usa tipos enteros para tus cálculos de dinero. Esto no se puede enfatizar lo suficiente, ya que a primera vista podría 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 intenta 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 puede 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

6
2017-07-22 14:56



Creo que la principal diferencia al lado del ancho de bit es que el decimal tiene exponente base 10 y el doble tiene 2

http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html


4
2017-11-26 13:23