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

Perdita di precisione numerica di SQL Server 2005

Proprio come l'aggiunta del tipo float è imprecisa, la moltiplicazione dei tipi decimali può essere imprecisa (o causare imprecisione) se si supera la precisione. Vedi Conversione del tipo di dati e decimale e numerico .

Poiché hai moltiplicato NUMERIC(24,8) e NUMERIC(24,8) e SQL Server controllerà solo il tipo e non il contenuto, probabilmente proverà a salvare le potenziali 16 cifre non decimali (24 - 8) quando non può salvare tutte le 48 cifre di precisione (il massimo è 38). Combinane due, ottieni 32 cifre non decimali, che ti lasciano solo 6 cifre decimali (38 - 32).

Quindi la query originale

SELECT A, B, C, A + B * C
FROM ( SELECT CAST(0.12345678 AS NUMERIC(24,8)) AS A,
  CAST(0 AS NUMERIC(24,8)) AS B,
  CAST(500 AS NUMERIC(24,8)) AS C ) T

si riduce a

SELECT A, B, C, A + D
FROM ( SELECT CAST(0.12345678 AS NUMERIC(24,8)) AS A,
  CAST(0 AS NUMERIC(24,8)) AS B,
  CAST(500 AS NUMERIC(24,8)) AS C,
  CAST(0 AS NUMERIC(38,6)) AS D ) T

Di nuovo, tra NUMERIC(24,8) e NUMERIC(38,6) , SQL Server proverà a salvare le potenziali 32 cifre non decimali, quindi A + D si riduce a

SELECT CAST(0.12345678 AS NUMERIC(38,6))

che ti dà 0.123457 dopo l'arrotondamento.