Точно както добавянето на типа float е неточно, умножението на десетичните типове може да бъде неточно (или да причини неточност), ако превишите прецизността. Вижте Преобразуване на типове данни и десетични и цифрови .
Тъй като сте умножили 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
след закръгляване.