Assim como a adição do tipo float é imprecisa, a multiplicação dos tipos decimais pode ser imprecisa (ou causar imprecisão) se você exceder a precisão. Consulte Conversão de tipo de dados e decimal e numérico .
Como você multiplicou
NUMERIC(24,8)
e NUMERIC(24,8)
, e o SQL Server verificará apenas o tipo e não o conteúdo, provavelmente tentará salvar os possíveis 16 dígitos não decimais (24 - 8) quando não puder salvar todos os 48 dígitos de precisão (máximo é 38). Combine dois deles, você obtém 32 dígitos não decimais, o que deixa você com apenas 6 dígitos decimais (38 - 32). Assim, a consulta original
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
reduz 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
Novamente, entre
NUMERIC(24,8)
e NUMERIC(38,6)
, o SQL Server tentará salvar os possíveis 32 dígitos de não-decimais, então A + D
reduz a SELECT CAST(0.12345678 AS NUMERIC(38,6))
que lhe dá
0.123457
após o arredondamento.