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 doublepode armazenar os vários números de casas decimais que provavelmente encontraremos.
Um único doublecampo 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 doublenão é sem ressalvas.
No entanto, não é perda de precisão, como alguns tendem a apontar. Mesmo que doubleele 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 mdí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