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)
Où
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))