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

Gns. af float-inkonsekvens

Dette er meget lig:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

Problemet er det med unøjagtig datatype (FLOAT/REAL ) rækkefølgen af ​​af aritmetiske operationer på flydende komma spørgsmål. Demo fra 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

Mulige løsninger:

  • CAST alle argumenter til nøjagtig datatype som DECIMAL/NUMERIC
  • ændre tabel og ændre FLOAT til DECIMAL
  • du kan prøve at tvinge forespørgselsoptimering til at beregne summen med samme rækkefølge.

Den gode nyhed er, at når et stabilt forespørgselsresultat er vigtigt for din applikation, kan du tvinge ordren til at være den samme ved at forhindre parallellisme med OPTION (MAXDOP 1) .

Det ser ud til, at det oprindelige link er dødt. WebArkiv




  1. Admin-scripts i R12.2 Ebuisness Suite

  2. Oracle-tekst undslipper med krøllede seler og jokertegn

  3. Kan ikke hente id'et for den sidst indsatte række i Hibernate ved hjælp af Oracle

  4. Tilslutning af Talend på Windows til en ODBC-database