Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Durchschnitt der Float-Inkonsistenz

Dies ist sehr ähnlich zu:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

Das Problem ist, dass bei ungenauem Datentyp (FLOAT/REAL ) die Reihenfolge arithmetischer Operationen auf Gleitkommazahlen. Demo von 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

Mögliche Lösungen:

  • CAST alle Argumente zum genauen Datentyp wie DECIMAL/NUMERIC
  • Tabelle ändern und FLOAT ändern zu DECIMAL
  • Sie können versuchen, den Abfrageoptimierer zu zwingen, die Summe mit derselben Reihenfolge zu berechnen.

Die gute Nachricht ist, dass Sie, wenn ein stabiles Abfrageergebnis für Ihre Anwendung wichtig ist, die gleiche Reihenfolge erzwingen können, indem Sie die Parallelität mit OPTION (MAXDOP 1) verhindern .

Es sieht so aus, als wäre der ursprüngliche Link tot. WebArchiv