Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Use float ou decimal para o valor em dólar do aplicativo contábil?


O tipo de dados Float ou Decimal deve ser usado para valores em dólares?

A resposta é fácil. Nunca flutua. NUNCA !

Os floats eram de acordo com o IEEE 754 sempre binários, apenas o novo padrão IEEE 754R definia os formatos decimais. Muitas das partes binárias fracionárias nunca podem igualar a representação decimal exata.

Qualquer número binário pode ser escrito como m/2^n (m , n inteiros positivos), qualquer número decimal como m/(2^n*5^n) .Como os binários não têm o factor 5 principal , todos os números binários podem ser representados exatamente por decimais, mas não vice-versa.
0.3 = 3/(2^1 * 5^1) = 0.3

0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125]

          1/4         1/8         1/16          1/32

Então você acaba com um número maior ou menor que o número decimal fornecido. Sempre.

Por que isso importa? Arredondamento.

O arredondamento normal significa 0..4 para baixo, 5..9 para cima. Então faz importa se o resultado for 0.049999999999 .... ou 0.0500000000 ... Você pode saber que significa 5 centavos, mas o computador não sabe disso e arredonda 0.4999 ... down (errado) e 0.5000 ... para cima (direita).

Dado que o resultado dos cálculos de ponto flutuante sempre contém pequenos termos de erro, a decisão é pura sorte. Fica inútil se você quiser manipulação decimal de arredondamento para par com números binários.

Não convencido? Você insiste que em seu sistema de contas tudo está perfeitamente bem? Ativos e passivos são iguais? Ok, então pegue cada um dos números formatados de cada entrada, analise-os e some-os com um sistema decimal independente!

Compare isso com a soma formatada. Ops, tem algo errado, não é?

Para esse cálculo, foi necessária extrema precisão e fidelidade (usamos o Oracle'sFLOAT) para que pudéssemos registrar os "bilionésimos de um centavo" sendo acumulados.

Não ajuda contra este erro. Porque todas as pessoas assumem automaticamente que o computador faz a soma certa e praticamente ninguém verifica de forma independente.