Eu estava tentando descobrir a origem do que parecia ser um erro de arredondamento hoje e descobri que uma das colunas usadas em uma equação matemática estava usando o tipo de dados real , e isso está fazendo com que minha equação retorne um valor incorreto.
Alguém pode me explicar porque
SELECT 776.2384 * cast(100 as real) / 100
é igual 776.2385
enquanto
SELECT 776.2384 * 100 / 100
igual 776.2384
?
Consulte Usando dados decimais, flutuantes e reais e precedência de tipo de dados
Em sua segunda consulta,
776.2384
é um número decimal (assim como os outros dois valores). Portanto, o cálculo é feito nesse tipo e o resultado é matematicamente exato.No primeiro, você introduz um arquivo
real
. Os demais literais são promovidos a esse tipo, e o cálculo é feito de acordo com as regras do IEEE 754, em modo de arredondamento. Os pontos flutuantes IEEE 754 não são exatos, então você geralmente não obterá o resultado "matematicamente exato" que você espera.Citação dos artigos acima: