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.