Nós usamos double
.
*suspiro*
Por quê?
Porque ele pode representar qualquer número de 15 dígitos sem restrições sobre onde está o ponto decimal . Tudo por um mísero 8 bytes!
Portanto, pode representar:
0.123456789012345
123456789012345.0
... e qualquer coisa no meio.
Isso é útil porque estamos lidando com moedas globais e double
pode armazenar os vários números de casas decimais que provavelmente encontraremos.
Um único double
campo pode representar 999.999.999.999.999s em ienes japoneses, 9.999.999.999.999.999s em dólares americanos e até 9.999.999.9999999999s em bitcoins
Se você tentar fazer o mesmo decimal
, precisará de um decimal(30, 15)
custo de 14 bytes.
Ressalvas
Claro, o uso double
não é sem ressalvas.
No entanto, não é perda de precisão, como alguns tendem a apontar. Mesmo que double
ele próprio não seja internamente exato para o sistema base 10 , podemos torná-lo exato arredondando o valor que extraímos do banco de dados para suas casas decimais significativas. Se necessário, é isso. (por exemplo, se for produzido, e a representação da base 10 é necessária.)
As advertências são: sempre que executamos aritmética com ele, precisamos normalizar o resultado (arredondando-o para suas casas decimais significativas) antes de:
- Realizando comparações.
- Escrevendo de volta no banco de dados.
Outro tipo de ressalva é que, diferentemente de decimal(m, d)
onde o banco de dados impedirá que os programas insiram um número com mais de m
dígitos, essas validações não existem double
. Um programa pode inserir um valor digitado pelo usuário de 20 dígitos e acabará sendo gravado silenciosamente como uma quantidade imprecisa.
deimal(10,2)
é o que eu uso ... você pode ajustar os valores, dependendo do tamanho esperado