So wie die Addition des Float-Typs ungenau ist, kann die Multiplikation der Dezimaltypen ungenau sein (oder zu Ungenauigkeiten führen), wenn Sie die Genauigkeit überschreiten. Siehe Datentypkonvertierung und dezimal und numerisch .
Da Sie NUMERIC(24,8)
multipliziert haben und NUMERIC(24,8)
, und SQL Server überprüft nur den Typ, nicht den Inhalt, es wird wahrscheinlich versuchen, die potenziellen 16 Nicht-Dezimalstellen (24 - 8) zu speichern, wenn es nicht alle 48 Stellen der Genauigkeit speichern kann (maximal 38). Wenn Sie zwei davon kombinieren, erhalten Sie 32 Nicht-Dezimalziffern, sodass Sie nur noch 6 Dezimalziffern (38 - 32) haben.
Also die ursprüngliche Abfrage
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
reduziert sich auf
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
Wieder zwischen NUMERIC(24,8)
und NUMERIC(38,6)
, versucht SQL Server, die potenziellen 32 Nicht-Dezimalstellen zu speichern, also A + D
reduziert sich auf
SELECT CAST(0.12345678 AS NUMERIC(38,6))
was Ihnen 0.123457
gibt nach Rundung.