Так же, как сложение типа с плавающей точкой является неточным, умножение десятичных типов может быть неточным (или вызывать неточность), если вы превысите точность. См. Преобразование типов данных и Десятичные и числовые .
Так как вы умножили NUMERIC(24,8)
и NUMERIC(24,8)
, и SQL Server будет проверять только тип, а не содержимое, он, вероятно, попытается сохранить возможные 16 недесятичных цифр (24 - 8), когда не может сохранить все 48 цифр точности (макс. 38). Объединив два из них, вы получите 32 недесятичных знака, в результате чего у вас останется только 6 десятичных знаков (38 - 32).
Таким образом, оригинальный запрос
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
уменьшается до
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
Опять же, между NUMERIC(24,8)
и NUMERIC(38,6)
, SQL Server будет пытаться сохранить потенциальные 32 цифры не десятичных, поэтому A + D
уменьшается до
SELECT CAST(0.12345678 AS NUMERIC(38,6))
, что дает вам 0.123457
после округления.