Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Media dell'incoerenza del float

Questo è molto simile a:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

Il problema è che con tipo di dati impreciso (FLOAT/REAL ) l'ordine delle operazioni aritmetiche su argomenti in virgola mobile. Demo da Connect:

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

Possibili soluzioni:

  • CAST tutti gli argomenti per un tipo di dati accurato come DECIMAL/NUMERIC
  • modifica la tabella e cambia FLOAT a DECIMAL
  • puoi provare a forzare Query Optimizer a calcolare la somma con lo stesso ordine.

La buona notizia è che quando un risultato di query stabile è importante per la tua applicazione, puoi forzare l'ordine in modo che sia lo stesso prevenendo il parallelismo con OPTION (MAXDOP 1) .

Sembra che il collegamento iniziale sia morto. Archivio Web