SQL Server, bölüm sıfır döndürüyor


87

Örnekte kullandığım kod şu:

 PRINT @set1
 PRINT @set2

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

İşte sonuç:

47
638
0

Bunun 0yerine neden geri döndüğünü bilmek isterim0,073667712


bu bir 'int': DECLARE @weight INT
Roch

Yanıtlar:


156

Ya set1 ve set2'yi tamsayılar yerine yüzer sayılar olarak bildirin ya da hesaplamanın bir parçası olarak onları yüzer sayılara çevirin:

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

24

Bir bölmede yalnızca tamsayı kullandığınızda, tamsayı bölme elde edersiniz. (En az bir) double veya float kullandığınızda, kayan nokta bölme (ve almak istediğiniz cevabı) elde edeceksiniz.

Böylece yapabilirsiniz

  1. değişkenlerden birini veya her ikisini float / double olarak beyan edin
  2. değişkenlerden birini veya her ikisini float / double için çevirin.

Tamsayı bölmesinin sonucunu ikiye katlamayın: Bölme zaten tamsayı bölümü olarak yapıldı, bu nedenle ondalık sayıların arkasındaki sayılar zaten kayboldu.


4
+1 çünkü sanırım bunu biraz daha iyi açıkladınız ve değerlerden sadece birinin float / double olması gerektiğini söylediniz
bahsetti

11

Çünkü bu bir tamsayı. Bunları kayan nokta sayıları veya ondalık sayılar olarak tanımlamanız veya hesaplamada buna çevirmeniz gerekir.


@Weight değişkenini float olarak değiştirirsem yeterli olur mu?
Roch

10

Bölmenin altını 1.0 (veya istediğiniz kadar ondalık basamak) ile çarpın.

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

Teşekkürler dostum. Kodunuz bunu cevaplamama yardımcı oldu - stackoverflow.com/questions/20532187/… Bana bu çarpmanın neden olduğu fazladan sıfırları nasıl keseceğimi söyleyebilir misiniz? Teşekkürler.
Trojan.ZBOT

2

float veya herhangi bir ondalık format olarak bildirirseniz,

0

bir tek

Örneğin :

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

Çıkış: 0

Çıktı olarak istiyorsanız

0,073667712

Örneğin

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight

Tamam, şimdi anlıyorum ama bölmek istediğim iki sayı değişkenler ve değişkende .0000 belirtilmemişse işe yaramıyor.
Roch

bu yüzden float için hem @ set1 hem de @
set2'yi kullanmalısınız

1

SQL Server'da iki tamsayının doğrudan bölümü, sonuç kayan nokta olsa bile tamsayı döndürür. Bunu geçmek için aşağıda bir örnek var:

--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

Sadece son blok 3,14285714285714'ü döndürecektir. Doğru hassasiyetle tanımlanan ikinci bloğa rağmen sonuç 3.00000 olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.