Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verlust der numerischen Genauigkeit von SQL Server 2005

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.