Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Perda de precisão numérica do SQL Server 2005


Assim como a adição do tipo float é imprecisa, a multiplicação dos tipos decimais pode ser imprecisa (ou causar imprecisão) se você exceder a precisão. Consulte Conversão de tipo de dados e decimal e numérico .

Como você multiplicou NUMERIC(24,8) e NUMERIC(24,8) , e o SQL Server verificará apenas o tipo e não o conteúdo, provavelmente tentará salvar os possíveis 16 dígitos não decimais (24 - 8) quando não puder salvar todos os 48 dígitos de precisão (máximo é 38). Combine dois deles, você obtém 32 dígitos não decimais, o que deixa você com apenas 6 dígitos decimais (38 - 32).

Assim, a 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

reduz 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

Novamente, entre NUMERIC(24,8) e NUMERIC(38,6) , o SQL Server tentará salvar os possíveis 32 dígitos de não-decimais, então A + D reduz a
SELECT CAST(0.12345678 AS NUMERIC(38,6))

que lhe dá 0.123457 após o arredondamento.