sql >> Base de Datos >  >> RDS >> Sqlserver

Promedio de inconsistencia flotante

Esto es muy similar a:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

El problema es que con un tipo de datos inexacto (FLOAT/REAL ) el orden de las operaciones aritméticas en materia de punto flotante. Demostración de conectar:

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

Posibles soluciones:

  • CAST todos los argumentos para un tipo de datos preciso como DECIMAL/NUMERIC
  • modifique la tabla y cambie FLOAT a DECIMAL
  • puede intentar forzar el optimizador de consultas para calcular la suma con el mismo orden.

La buena noticia es que cuando un resultado de consulta estable es importante para su aplicación, puede forzar que el orden sea el mismo al evitar el paralelismo con OPCIÓN (MAXDOP 1) .

Parece que el enlace inicial está muerto. Archivo web