91 votes

SQL Server, la division renvoie zéro

Voici le code que j'utilise dans l'exemple :

 PRINT @set1
 PRINT @set2

 SET @weight= @set1 / @set2;
 PRINT @weight

Voici le résultat :

47
638
0

J'aimerais savoir pourquoi il revient. 0 au lieu de 0,073667712

0 votes

C'est un 'int' : DECLARE @weight INT

165voto

Martin Points 15155

Soit vous déclarez que set1 et set2 sont des flottants au lieu d'entiers, soit vous les convertissez en flottants dans le cadre du calcul :

SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);

26voto

Hans Kesting Points 17043

Lorsque vous utilisez uniquement des nombres entiers dans une division, vous obtenez une division entière. Lorsque vous utilisez (au moins un) double ou un flottant, vous obtiendrez une division en virgule flottante (et la réponse que vous souhaitez obtenir).

Donc vous pouvez

  1. déclarer l'une ou les deux variables comme float/double
  2. transforme l'une ou les deux variables en float/double.

Ne vous contentez pas de convertir le résultat de la division entière en double : la division a déjà été effectuée en tant que division entière, donc les chiffres derrière la décimale sont déjà perdus.

4 votes

+1 parce que je pense que vous l'avez expliqué un peu mieux et que vous avez mentionné que seule une des valeurs doit être un float/double.

14voto

HLGEM Points 54641

Il suffit de multiplier le bas de la division par 1,0 (ou par autant de décimales que vous le souhaitez).

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight

0 votes

Merci. Votre code m'a aidé à répondre à cette question - stackoverflow.com/questions/20532187/ Pouvez-vous me dire comment tronquer les zéros supplémentaires causés par cette multiplication ? Merci.

12voto

Parce que c'est un nombre entier. Vous devez les déclarer comme des nombres à virgule flottante ou des décimales, ou les convertir en ces nombres dans le calcul.

2voto

anishMarokey Points 6895

Si vous le déclarez en tant que float ou tout autre format décimal, il affichera

0

sólo

Par exemple :

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

Sortie : 0

Si vous voulez que la sortie soit

0.073667712

Par exemple

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight

0 votes

Hum ok j'ai compris maintenant mais les deux nombres que je veux diviser sont des variables, et cela ne semble pas fonctionner si le .0000 n'est pas spécifié dans la variable.

0 votes

Vous devez donc convertir @set1 et @set2 en float :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X