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
Odpowiedzi:
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);
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
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.
Ponieważ jest to liczba całkowita. Musisz zadeklarować je jako liczby zmiennoprzecinkowe lub dziesiętne lub rzutować na takie w obliczeniach.
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
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
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.