sql >> Base de Datos >  >> RDS >> Sqlserver

Pérdida de precisión numérica del servidor SQL 2005

Así como la suma del tipo flotante es inexacta, la multiplicación de los tipos decimales puede ser inexacta (o causar inexactitud) si excede la precisión. Consulte Conversión de tipos de datos y decimal y numérico .

Como multiplicaste NUMERIC(24,8) y NUMERIC(24,8) , y SQL Server solo verificará el tipo, no el contenido, probablemente intentará guardar los 16 dígitos no decimales potenciales (24 - 8) cuando no puede guardar los 48 dígitos de precisión (el máximo es 38). Combina dos de ellos, obtienes 32 dígitos no decimales, lo que te deja con solo 6 dígitos decimales (38 - 32).

Así, la consulta original

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

se reduce a

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

De nuevo, entre NUMERIC(24,8) y NUMERIC(38,6) , SQL Server intentará guardar los posibles 32 dígitos no decimales, por lo que A + D se reduce a

SELECT CAST(0.12345678 AS NUMERIC(38,6))

lo que te da 0.123457 después de redondear.