Pergunta

Esta questão já tem uma resposta aqui:

Eu continuo vendo as pessoas que utilizam duplas em C #. Eu sei que eu li em algum lugar que duplos de precisão, às vezes perde. A minha pergunta é quando um deve usar um casal e quando devo usar um tipo decimal? Que tipo é apropriado para cálculos de dinheiro? (Ie. Superiores a US $ 100 milhões)

Foi útil?

Solução

Por dinheiro, sempre decimal. É por isso que ele foi criado.

Se os números devem somar corretamente ou equilibrar, uso decimal. Isto inclui qualquer armazenamento financeira ou cálculos, pontuação, ou outros números que as pessoas possam fazer à mão.

Se o valor exato de números não é importante, utilize o dobro de velocidade. Isso inclui gráficos, física ou outros cálculos ciências físicas, onde já existe um "número de dígitos significativos".

Outras dicas

A minha pergunta é quando deve um uso um dobrar e quando devo usar um decimal digite?

decimal para quando você trabalhar com valores na faixa de 10 ^ (+/- 28) e onde você tem expectativas sobre o comportamento com base na base de 10 representações -., Basicamente dinheiro

double para quando você precisa relação precisão (ou seja, a perda de precisão nos dígitos à direita sobre grandes valores não é um problema) em toda descontroladamente diferentes magnitudes - Cobre double mais de 10 ^ (+/- 300) . cálculos científicos são o melhor exemplo aqui.

que tipo é apropriado para o dinheiro computações?

decimal, decimal , decimal

Não aceite substitutos.

O factor mais importante é que double, ser implementado como uma fracção de binário, não pode representar com precisão muitas fracções decimal (como 0,1) em tudo e o seu número total de dígitos é menor, uma vez que é 64- bits de largura x 128 bits para decimal. Finalmente, aplicações financeiras, muitas vezes tem que seguir específica arredondamento modos (por vezes exigido por lei). decimal suporta estes ; double não.

System.Single / < a href = "http://msdn.microsoft.com/en-us/library/b1e65aza(VS.80).aspx" rel = "noreferrer"> flutuador - 7 dígitos
System.Double / duplo - 15-16 dígitos
System.Decimal / decimal - 28-29 dígitos significativos

A maneira que eu fui picado usando o tipo errado (alguns bons anos atrás) é com grandes quantidades:

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

Você esgotou em 1 milhão para um flutuador.

Um valor monetário de 15 dígitos:

  • £ 1,234,567,890,123.45

9 trilhões com um duplo. Mas com a divisão e comparações é mais complicado (eu sou definitivamente nenhum especialista em números de ponto flutuante e irracionais - ver o ponto de Marc). Misturando decimais e duplas causa problemas:

A operação matemática ou comparação que utiliza um número de ponto flutuante pode não se obter o mesmo resultado se um número decimal é usado porque o número de ponto flutuante não pode exatamente aproximar o decimal número.

Quando devo usar double em vez de decimal? tem algumas respostas profundidade semelhantes e mais em.

Usando double vez de decimal para aplicações monetárias é um micro-otimização -. Essa é a maneira mais simples que eu olhar para ele

Decimal é para valores exatos. Duplo é para valores aproximados.

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

Por dinheiro: decimal. Custa um pouco mais de memória, mas não tem problemas de arredondamento como double às vezes tem.

Definitivamente uso inteiros tipos para seus cálculos de dinheiro. Isso não pode ser enfatizado o suficiente, já que à primeira vista pode parecer que um tipo de ponto flutuante é adequada.

Aqui um exemplo no 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 muito normal.

Agora tente isso de novo com 10 ^ 20 dólares zimbabuanos

>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0

Como você pode ver, o dólar desapareceu.

Se você usar o tipo inteiro, ele funciona bem:

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

Eu acho que a principal diferença ao lado de largura bit é que decimal tem base de expoente 10 e dupla tem 2

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top