SQL Server, dzielenie zwraca zero

86

Oto kod, którego używam w przykładzie:

 PRINT @set1
 PRINT @set2

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

Oto wynik:

47
638
0

Chciałbym wiedzieć, dlaczego wraca 0zamiast0,073667712

Roch
źródło
to jest „int”: DECLARE @weight INT
Roch

Odpowiedzi:

152

Zadeklaruj zbiór1 i zestaw2 jako liczby zmiennoprzecinkowe zamiast liczb całkowitych lub rzuć je na liczby zmiennoprzecinkowe jako część obliczeń:

SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);
Jaskółka oknówka
źródło
24

Kiedy używasz tylko liczb całkowitych w dzieleniu, otrzymasz dzielenie całkowite. Kiedy użyjesz (przynajmniej jednej) liczby podwójnej lub zmiennoprzecinkowej, otrzymasz dzielenie zmiennoprzecinkowe (i odpowiedź, którą chcesz uzyskać).

Więc możesz

  1. zadeklaruj jedną lub obie zmienne jako zmiennoprzecinkowe / podwójne
  2. rzut jednej lub obu zmiennych na float / double.

Nie rzutuj wyniku dzielenia liczb całkowitych na podwojenie: dzielenie zostało już wykonane jako dzielenie całkowite, więc liczby znajdujące się za ułamkiem dziesiętnym są już utracone.

Hans Ke ing
źródło
4
+1, ponieważ myślę, że wyjaśniłeś to trochę lepiej i wspomniałeś, że tylko jedna z wartości musi być zmiennoprzecinkową / podwójną
Chaulky
11

Ponieważ jest to liczba całkowita. Musisz zadeklarować je jako liczby zmiennoprzecinkowe lub dziesiętne lub rzutować na takie w obliczeniach.


źródło
Jeśli zmienię zmienną @weight na float, czy to wystarczy?
Roch
10

Po prostu pomnóż dolną część podziału przez 1,0 (lub tyle miejsc po przecinku, ile chcesz)

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight
HLGEM
źródło
Dzięki stary. Twój kod pomógł mi odpowiedzieć na to pytanie - stackoverflow.com/questions/20532187/… Czy możesz mi powiedzieć, jak skrócić dodatkowe zera spowodowane tym mnożeniem? Dzięki.
Trojan.ZBOT,
2

jeśli zadeklarujesz go jako zmiennoprzecinkowy lub dowolny format dziesiętny, zostanie wyświetlony

0

tylko

Np .:

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

Wyjście: 0

Jeśli chcesz, aby dane wyjściowe były w formacie

0,073667712

Na przykład

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight
anishMarokey
źródło
Hum ok Rozumiem, ale dwie liczby, które chcę podzielić, są zmiennymi i wydaje się, że nie działa, jeśli wartość .0000 nie jest określona w zmiennej.
Roch
więc musisz rzucić zarówno @ set1, jak i @ set2 na float :)
anishMarokey
1

W SQL Server bezpośredni podział dwóch liczb całkowitych zwraca liczbę całkowitą, nawet jeśli wynikiem powinna być liczba zmiennoprzecinkowa. Poniżej znajduje się przykład, aby to przekazać:

--1--
declare @weird_number_float float
set @weird_number_float=22/7
select @weird_number_float

--2--
declare @weird_number_decimal decimal(18,10)
set @weird_number_decimal=22/7 
select @weird_number_decimal

--3--
declare @weird_number_numeric numeric
set @weird_number_numeric=22/7 
select @weird_number_numeric

--Right way

declare @weird_number float
set @weird_number=cast(22 as float)/cast(7 as float)
select @weird_number

Tylko ostatni blok zwróci 3,14285714285714. Pomimo drugiego bloku zdefiniowanego z odpowiednią precyzją wynik wyniesie 3,00000.

Dr Suat Atan
źródło