Net zoals toevoeging van het type float onnauwkeurig is, kan vermenigvuldiging van de decimale typen onnauwkeurig zijn (of onnauwkeurigheid veroorzaken) als u de precisie overschrijdt. Zie Conversie van gegevenstype en decimaal en numeriek .
Omdat je NUMERIC(24,8)
. hebt vermenigvuldigd en NUMERIC(24,8)
, en SQL Server controleert alleen het type en niet de inhoud, het zal waarschijnlijk proberen de potentiële 16 niet-decimale cijfers (24 - 8) op te slaan als het niet alle 48 cijfers van precisie kan opslaan (max is 38). Als je er twee combineert, krijg je 32 niet-decimale cijfers, waardoor je nog maar 6 decimale cijfers hebt (38 - 32).
Dus de oorspronkelijke vraag
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
reduceert tot
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
Nogmaals, tussen NUMERIC(24,8)
en NUMERIC(38,6)
, zal SQL Server proberen de mogelijke 32 cijfers van niet-decimalen op te slaan, dus A + D
reduceert tot
SELECT CAST(0.12345678 AS NUMERIC(38,6))
die je 0.123457
. geeft na afronding.