Changement de type de données dans la division SQL Server

Lorsque je lance la requête ci-dessous dans le server sql 2014, le type de données de sortie semble différent du type de données d'input

DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8 SELECT (@i/@j) 

La production attendue est de: 0,25
Mais ce que je reçois est: 0,25000000000000000000

Puis-je savoir pourquoi ce DECIMAL (18,2) est changé?

Essayez avec la requête ci-dessous.

 DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8 SELECT CAST((@i/@j) as decimal(18,2)) 

Tu peux essayer ça

 SELECT convert(decimal(18,2),(@i/@j)) 

Pour SQL Server 2012+, vous pouvez utiliser FORMAT() :

 SELECT FORMAT((@i/@j), 'N2') 

Comme l'a dit @Damien_the_Unbeliever, vous devriez noter que cela returnnera la sortie sous forme de string.

Pour les versions inférieures, essayez ceci:

 SELECT cast((@i/@j) as decimal(18,2)) 

Essayez simplement ceci:

 DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8 SELECT (@i/CAST(@j AS FLOAT)) 

OU

 DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8 SELECT CAST((@i/@j) AS FLOAT) 

S'il vous plaît se référer à https://msdn.microsoft.com/en-IN/library/ms190476.aspx

En ce qui concerne l'échelle et la précision d'une opération de division normale est comme suit

Opération: e1 / e2

Précision du résultat (Pr): p1 - s1 + s2 + max(6, s1 + p2 + 1)

Echelle des résultats (Sr): max(6, s1 + p2 + 1)

p1 est la précision de e1

s1 est l'échelle de e1

p2 est la précision de e1

s2 est l'échelle de e1

Dans votre cas p1 = p2 = 18 et s1 = s2 = 2

Selon le calcul ci-dessus

La précision de la sortie (Pr) et de l'échelle de sortie (Sr) sera la suivante

Pr = p1 - s1 + s2 + max(6, s1 + p2 + 1)

Pr = 18 - 2 + 2 + max(6, 2 + 18 + 1)

Pr = 18 - 2 + 2 + 21

Pr = 39

Par conséquent, il doit y avoir un maximum de 39 numbers dans le résultat. Mais

  • La précision et l'échelle du résultat ont un maximum absolu de 38. Lorsqu'une précision de résultat est supérieure à 38, l'échelle correspondante est réduite pour empêcher la partie intégrale d'un résultat d'être tronquée.

il y aura donc 38 numbers.

Comme le résultat de la division en valeur décimale est inférieur à un mais supérieur à 0, il ne donnera qu'un 0 avant la virgule

Maintenant, laissez calculer l'échelle (Sr)

Sr = max(6, s1 + p2 + 1)

Sr = max(6, 2 + 18 + 1)

Sr = 21

Il doit y avoir 21 numbers après le point décimal. Cependant, selon la valeur de précision maximale, le dernier chiffre de l'échelle sera tronqué. C'est pourquoi dans votre résultat, vous avez seulement 20 numbers après la virgule.

D'où le résultat 0,25000000000000000000

Si vous voulez get 0,25 le tour de la division en utilisant CAST ou Convertir comme suit

 DECLARE @i DECIMAL(18,3) = 2 ,@j DECIMAL(18,3) = 8 SELECT CAST((@i/@j) AS Decimal(18,2))