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

Média de inconsistência flutuante


Isso é muito semelhante a:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

O problema é que com tipo de dados impreciso (FLOAT/REAL ) a ordem das operações aritméticas em questões de ponto flutuante. Demonstração da conexão:
DECLARE @fl FLOAT = 100000000000000000000
DECLARE @i SMALLINT = 0
WHILE (@i < 100)
BEGIN
    SET @fl = @fl + CONVERT(float, 5000)
    SET @i = @i + 1
END
SET @fl = @fl - 100000000000000000000
SELECT CONVERT(NVARCHAR(40), @fl, 2)
-- 0.000000000000000e+000


DECLARE @fl FLOAT = 0
DECLARE @i SMALLINT = 0
WHILE (@i < 100)
BEGIN
    SET @fl = @fl + CONVERT(float, 5000)
    SET @i = @i + 1
END
SET @fl = @fl + 100000000000000000000
SET @fl = @fl - 100000000000000000000
SELECT @fl
-- 507904

LiveDemo

Soluções possíveis:
  • CAST todos os argumentos para tipos de dados precisos como DECIMAL/NUMERIC
  • alterar tabela e alterar FLOAT para DECIMAL
  • você pode tentar forçar o otimizador de consulta a calcular a soma com a mesma ordem.

A boa notícia é que quando um resultado de consulta estável é importante para seu aplicativo, você pode forçar a ordem a ser a mesma evitando o paralelismo com OPTION (MAXDOP 1) .

Parece que o link inicial está morto. WebArchive