Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Perte de précision numérique SQL Server 2005

Tout comme l'addition du type flottant est inexacte, la multiplication des types décimaux peut être inexacte (ou entraîner une inexactitude) si vous dépassez la précision. Voir Conversion de type de données et décimal et numérique .

Puisque vous avez multiplié NUMERIC(24,8) et NUMERIC(24,8) , et que SQL Server ne vérifie que le type et non le contenu, il essaiera probablement d'enregistrer les 16 chiffres non décimaux potentiels (24 - 8) lorsqu'il ne peut pas enregistrer les 48 chiffres de précision (le maximum est de 38). Combinez-en deux, vous obtenez 32 chiffres non décimaux, ce qui vous laisse avec seulement 6 chiffres décimaux (38 - 32).

Ainsi la requête d'origine

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

réduit à

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

Encore une fois, entre NUMERIC(24,8) et NUMERIC(38,6) , SQL Server essaiera d'enregistrer les 32 chiffres potentiels des non décimaux, donc A + D réduit à

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

ce qui vous donne 0.123457 après arrondi.