J'ai été surpris d'apprendre cela, je suis sûrement en train de faire une erreur ...
Si je DECLARE
une variable locale réelle (ou décimale), je ne peux pas affecter ( SET ) la valeur d'une expression? Je dois d'abord définir une valeur puis parcourir l'expression. Si j'essaye de "faire le calcul" d'un seul coup, j'obtiens
0
.
Donc, ça marche ..
DECLARE @HitRate real SET @HitRate = 805499 SET @HitRate = (@HitRate / 847125) * 100 --SET @HitRate = (805499 / 847125) * 100 --But this does not work? SELECT @HitRate
SET
et que j'utilise simplement la troisième, j'obtiens 0
3
, j'obtiens 0
CAST (@HitRate As DECIMAL (9,2))
j'obtiens 0
3 Réponses :
cela fonctionne pour moi: essayez d'ajouter .00 dans la valeur définie.
DECLARE @HitRate real SET @HitRate = 805499.00 SET @HitRate = (@HitRate / 847125.00) * 100.00 --SET @HitRate = (805499 / 847125) * 100 --But this does not work? SELECT @HitRate
Vous l'avez, désolé d'avoir été stupide à propos de mon CAST. Cela marche:
Donnez au gars le temps d'évaluer votre solution (et d'autres); ne suppliez pas les gens de marquer votre réponse comme réponse dans les 5 minutes.
démo vous devez faire que 805499 à 805499.00 ce qui signifie int pour flotter vous avez 0 parce que, 805499/847125 = 0,95 mais le moteur de base de données renvoie 0 parce qu'il prend que c'est une valeur entière, c'est pourquoi lorsque vous multipliez 100 par 0, il produit également la sortie 0 cast
comme ci-dessous
SET @HitRate = (cast( 805499 as float) / 847125) * 100
il renverra également 95.0862
p >
Si vous utilisez l'instruction suivante
DECLARE @HitRate real SET @HitRate = 805499 SET @HitRate = (@HitRate / 847125) * 100 SELECT @HitRate
Elle renverra 0
puisque 805499
et 847125
sont entier donc le résultat de la division est entier = 0
.
Basé sur Documentation officielle de la division TSQL :
Renvoie le type de données de l'argument avec la priorité la plus élevée.
Si un dividende entier est divisé par un diviseur entier, le résultat est un entier dont toute partie fractionnaire du résultat est tronquée.
Vous pouvez vérifier la liste de priorité des types de données SQL à partir du lien ci-dessous:
Mais lorsque vous utilisez:
SET @HitRate = (805499 / 847125) * 100
Il renverra 95.0862
depuis @HitRate code > est de type
real
et a une priorité plus élevée que l'entier
D'accord. Si je "retourne" {SET @HitRate = (847125/805499)} j'obtiens 1
Copie possible de Comment obtenir un résultat float en diviser deux valeurs entières?
Peter B, d'accord, dupliquer, je ne savais tout simplement pas que j'avais un problème de flotteur, pensait que c'était la complexité de l'expression parce que cela "fonctionnait" quand je l'ai cassé en étape. Vraiment juste fait une conversion après le premier set et m'a mis en territoire flottant.
C'est bizarre comment vous avez accepté la réponse la plus simple qui ne contient aucune clarification sur la cause puisque vous demandez pourquoi
(805499/847125) * 100
a renvoyé0
!!!! vous n'avez pas demandé comment faire une solution de contournement.