Precis som addition av float-typen är felaktig, kan multiplikation av decimaltyperna vara felaktig (eller orsaka felaktighet) om du överskrider precisionen. Se Datatypkonvertering och decimal och numerisk .
Sedan du multiplicerat NUMERIC(24,8)
och NUMERIC(24,8)
, och SQL Server kommer bara att kontrollera typen inte innehållet, kommer den förmodligen att försöka spara de potentiella 16 icke-decimalsiffrorna (24 - 8) när den inte kan spara alla 48 siffror med precision (max är 38). Kombinera två av dem, du får 32 icke-decimala siffror, vilket ger dig endast 6 decimalsiffror (38 - 32).
Alltså den ursprungliga frågan
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
minskar till
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
Återigen, mellan NUMERIC(24,8)
och NUMERIC(38,6)
, kommer SQL Server att försöka spara de potentiella 32 siffrorna för icke-decimaler, så A + D
minskar till
SELECT CAST(0.12345678 AS NUMERIC(38,6))
vilket ger dig 0.123457
efter avrundning.