Pregunta

Esta pregunta ya tiene 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 debo usar un tipo doble y cuándo debo usar un tipo decimal?¿Qué tipo es adecuado para cálculos monetarios?(es decir.mayor a $100 millones)

¿Fue útil?

Solución

Por dinero, siempre decimal. Es por eso que se ha creado.

Si los números deben sumar correctamente o el equilibrio, usar decimales. Esto incluye cualquier almacenamiento financiera o cálculos, las puntuaciones, u otros números que la gente podría hacer a mano.

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

Otros consejos

  

Mi pregunta es cuando se debe utilizar un una   doble y cuándo debo utilizar un número decimal   escribir?

decimal para cuando se trabaja con valores en el rango de 10 ^ (+/- 28) y donde se tiene expectativas sobre el comportamiento basado en la base de 10 representaciones -. Básicamente dinero

double para cuando se necesita relativa exactitud (es decir, la pérdida de precisión en los dígitos de cola sobre los valores grandes no es un problema) a través de muy diferentes magnitudes - double cubre más de 10 ^ (+/- 300) . Cálculos científicos son el mejor ejemplo de ello.

  

qué tipo es el adecuado para dinero   cálculos?

decimal, decimal , decimal

No acepte ningún substituto.

El factor más importante es que double, siendo implementado como una fracción binaria, no se puede representar con precisión muchas fracciones decimal (como 0,1) en absoluto y su número total de dígitos es menor ya que es 64- bit de ancho frente a 128 bits para decimal. Por último, las aplicaciones financieras a menudo tienen que seguir específica redondeo modos (a veces obligatoria por ley). decimal apoya estos ; double no lo hace.

Sistema.Único / flotar - 7 dígitos
Sistema.Doble / doble - 15-16 dígitos
Sistema.Decimal / decimal - 28-29 dígitos significativos

La forma en que me ha picado el uso del tipo incorrecto (hace unos cuantos 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 billones con un doble.Pero con la división y las comparaciones es más complicado (definitivamente no soy un experto en coma flotante y números irracionales. ver el punto de marc).Mezclar decimales y dobles causa problemas:

Una operación matemática o de comparación que utiliza 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 aproximar exactamente el número decimal.

¿Cuándo debo usar doble en lugar de decimal? tiene algunas respuestas similares y más detalladas.

Usando double en lugar de decimal para aplicaciones monetarias es una microoptimización; esa es la forma más sencilla en que lo veo.

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: decimal. Cuesta un poco más de memoria, pero no tiene problemas de redondeo como double tiene a veces.

Tipos de uso de números enteros para sus cálculos de dinero. Esto no puede enfatizarse lo suficiente, ya que a primera vista podría parecer que un tipo de coma flotante es adecuado.

A continuación, un ejemplo en el 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 intentarlo 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 se puede ver, el dólar desapareció.

Si se utiliza el tipo entero, que funciona bien:

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

I pensar que la diferencia principal al lado de anchura de bit es que decimal tiene base de exponente 10 y doble tiene 2

http: // referida a productos de software development.blogspot.com/2008/07/net-double-vs-decimal.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top