2009-11-03 15 views
62

Oto kod używam na przykład:SQL Server, podział zwraca zero

PRINT @set1 
PRINT @set2 

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

Oto wynik:

47 
638 
0 

Chciałbym wiedzieć, dlaczego to powrót 0 zamiast z 0,073667712

+0

Jaki jest typ danych @ weight? –

+0

to jest "int": DECLARE @weight INT – Roch

Odpowiedz

108

Obaj deklarują set1 i set2 jako pływaki zamiast liczb całkowitych lub rzucać je na pływaków jako część obliczeń:

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

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

+0

Jeśli zmienię zmienną @weight na float, czy to wystarczy? – Roch

2

jeśli zadeklarować ją jako pływaka lub dowolnym formacie dziesiętnym wyświetli

tylko

Np:

declare @weight float; 

SET @weight= 47/638; PRINT @weight 

wyjściowa: 0

Jeśli chcesz wyjście jako

0,073667712

Eg

declare @weight float; 

SET @weight= 47.000000000/638.000000000; PRINT @weight 
+0

Hum w porządku Otrzymuję go teraz, ale dwie liczby, które chcę podzielić, są zmienne i wydaje się, że nie działa, jeśli nie podano zmiennej .0000. – Roch

+0

, więc musisz rzucić zarówno @ set1, jak i @ set2, aby unosić :) – anishMarokey

13

Gdy używasz tylko liczb całkowitych w div ision, otrzymasz podział liczb całkowitych. Kiedy użyjesz (przynajmniej jeden) double lub float, otrzymasz dzielenie zmiennoprzecinkowe (i odpowiedź, którą chcesz uzyskać).

Więc można

  1. zadeklarować jedną lub obie zmienne jak pływaka/podwójne
  2. rzucić jeden lub oba zmiennych float/double.

Nie rzucaj wyniku podziału liczb całkowitych na podwójne: podział został już wykonany jako podział całkowity, więc liczby za ukośnikiem dziesiętnym są już utracone.

+1

+1, ponieważ myślę, że wyjaśniłeś to trochę lepiej i wspomniałeś, że tylko jedna z wartości musi być float/double – Chaulky

7

Wystarczy mutiply dno podziału przez 1.0 (lub tyle miejsc po przecinku, ile chcesz)

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

Dzięki człowieku. Twój kod pomógł mi odpowiedzieć na to - http://stackoverflow.com/questions/20532187/how-to-calculate-percent-of-total-within-group-by-statement Czy możesz mi powiedzieć, jak skrócić dodatkowe zera spowodowane przez to mnożenie? Dzięki. –

1

w SQL Server bezpośredniego dzielenia dwóch liczb całkowitych zwrotów całkowitych nawet jeśli wynik powinien być pływak. Poniżej znajduje się przykład:

--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 właściwą precyzją wynik wyniesie 3,00000.

Powiązane problemy