sql >> Database >  >> RDS >> Sqlserver

Gem. inconsistentie float

Dit lijkt erg op:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

Het probleem is dat met onnauwkeurig datatype (FLOAT/REAL ) de volgorde van rekenkundige bewerkingen op drijvende-kommakwesties. Demo van 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

Mogelijke oplossingen:

  • CAST alle argumenten voor een nauwkeurig datatype zoals DECIMAL/NUMERIC
  • tabel wijzigen en FLOAT wijzigen naar DECIMAL
  • u kunt proberen om de queryoptimalisatie te forceren om de som met dezelfde volgorde te berekenen.

Het goede nieuws is dat wanneer een stabiel zoekresultaat belangrijk is voor uw toepassing, u de volgorde hetzelfde kunt laten zijn door parallellisme te voorkomen met OPTIE (MAXDOP 1) .

Het lijkt erop dat de eerste link dood is. WebArchief




  1. Resultaten van een Mysql-query exporteren naar Excel?

  2. Hoe de lijst bijwerken en verwijderen Gegevens weergeven in SQLite-database met kliklistener?

  3. Uniek modelveld in Django en hoofdlettergevoeligheid (postgres)

  4. SQLite INSERT - OP DUPLICATE KEY UPDATE (UPSERT)