Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Średnia niespójności zmiennoprzecinkowej

Jest to bardzo podobne do:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

Problem polega na tym, że przy niedokładnym typie danych (FLOAT/REAL ) kolejność operacji arytmetycznych na zagadnieniach zmiennoprzecinkowych. Demo z połączenia:

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

Możliwe rozwiązania:

  • CAST wszystkie argumenty do dokładnego typu danych, jak DECIMAL/NUMERIC
  • zmień tabelę i zmień FLOAT na DECIMAL
  • możesz spróbować zmusić optymalizator zapytań do obliczenia sumy w tej samej kolejności.

Dobrą wiadomością jest to, że gdy stabilny wynik zapytania ma znaczenie dla Twojej aplikacji, możesz wymusić taką samą kolejność, zapobiegając równoległości za pomocą OPTION (MAXDOP 1) .

Wygląda na to, że link początkowy jest martwy. Archiwum internetowe




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstawianie zbiorcze programu SQL Server — część 2

  2. Zwróć bieżącą nazwę logowania w SQL Server (T-SQL)

  3. Jak działa funkcja STR() w SQL Server (T-SQL)

  4. Czy tabela serwera sql może mieć dwie kolumny tożsamości?

  5. Jak skopiować rekord w tabeli SQL, ale zamienić unikalny identyfikator nowego wiersza?