Question Pourquoi la précision diminue quand multiplier la somme à un autre nombre


J'ai rencontré avec bug (ou fonctionnalité) suivant dans SQL Server.

Quand j'utilise SUM (*column*) où column a un numeric(18, 8) tapez et multipliez-le à tout autre nombre (entier ou décimal) la précision du résultat réduit à numeric(18, 6).

Voici l'exemple de script à démontrer.

CREATE TABLE #temp (Qnty numeric(18,8))

INSERT INTO #temp (Qnty) VALUES (0.00000001)
INSERT INTO #temp (Qnty) VALUES (0.00000002)
INSERT INTO #temp (Qnty) VALUES (0.00000003)

SELECT Qnty, 1*Qnty
FROM #temp

SELECT (-1)*SUM(Qnty), SUM(Qnty), -SUM(Qnty), SUM(Qnty) * CAST(2.234 as numeric(18,8))
FROM #temp

DROP TABLE #temp

Le résultat de la deuxième requête SELECT

0.000000    0.00000006  -0.00000006 0.000000

Comme vous pouvez le voir alors je multiplie SUM le résultat est 0.000000

Quelqu'un pourrait-il expliquer le comportement étrange?

UPD. J'ai exécuté cette requête dans SQL Management Studio sur SQL Server 2000, 2005 et 2008.


12
2018-01-14 05:15


origine


Réponses:


Agréger un numeric(18, 8) avec SOMME  résultats dans le type de données numeric(38, 8).

Comment le type de données résultant est-il calculé en multipliant quelque chose par un nombre peut être trouvé ici: Précision, échelle et longueur (Transact-SQL)

Le type de données pour votre constante -1 est numeric(1, 0)

La précision est p1 + p2 + 1 = 40
L'échelle est s1 + s2 = 8

La précision maximale est de 38 et cela vous laisse avec numeric(38, 6).

En savoir plus sur pourquoi il est numeric(38, 6) ici: Multiplication et Division avec Numérique


7
2018-01-14 07:42



Si vous lisez Page de référence de SUM, vous verrez que sur une colonne décimale il donne un type de NUMERIC(38,6). Vous devez lancer le résultat de la SUM à NUMERIC(18,8) pour que cela fonctionne comme vous le souhaitez.

L'exécution SELECT CAST(SUM(Qnty) as numeric(18,8)) * 2.234 FROM #temp les rendements 0.00000013404 comme vous vous en doutez.


2
2018-01-14 07:53



une explication technique peut être trouvée à http://social.msdn.microsoft.com/Forums/en/transactsql/thread/233f7380-3f19-4836-b224-9f665b852406


0
2018-01-14 07:34