decimal vs duplo! - Qual deles devo usar e quando? [duplicado]
Pergunta
Esta questão já tem uma resposta aqui:
- Quando devo usar double em vez de decimal? 12 respostas
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)
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