Stejně jako sčítání typu float je nepřesné, násobení desetinných typů může být nepřesné (nebo způsobit nepřesnost), pokud překročíte přesnost. Viz Konverze typu dat a desítkové a numerické .
Protože jste vynásobili NUMERIC(24,8)
a NUMERIC(24,8)
a SQL Server zkontroluje pouze typ, nikoli obsah, pravděpodobně se pokusí uložit potenciálních 16 nedecimálních číslic (24 - 8), když nemůže uložit všech 48 číslic s přesností (max je 38). Spojením dvou z nich získáte 32 nedesítkových číslic, což vám zbude pouze 6 desetinných číslic (38 - 32).
Tedy původní dotaz
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
sníží na
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
Opět mezi NUMERIC(24,8)
a NUMERIC(38,6)
, SQL Server se pokusí uložit potenciálních 32 číslic bez desítkových čísel, takže A + D
sníží na
SELECT CAST(0.12345678 AS NUMERIC(38,6))
což vám dává 0.123457
po zaokrouhlení.