SQL Server, pembagian mengembalikan nol

87

Berikut adalah kode yang saya gunakan dalam contoh:

 PRINT @set1
 PRINT @set2

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

Inilah hasilnya:

47
638
0

Saya ingin tahu mengapa itu kembali, 0bukan0,073667712

Roch
sumber
ini adalah 'int': MENYATAKAN @weight INT
Roch

Jawaban:

156

Deklarasikan set1 dan set2 sebagai float, bukan integer, atau lemparkan ke float sebagai bagian dari kalkulasi:

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

Jika Anda hanya menggunakan bilangan bulat dalam sebuah divisi, Anda akan mendapatkan pembagian bilangan bulat. Saat Anda menggunakan (setidaknya satu) double atau float, Anda akan mendapatkan pembagian floating point (dan jawaban yang ingin Anda dapatkan).

Jadi kamu bisa

  1. mendeklarasikan satu atau kedua variabel sebagai float / double
  2. melemparkan satu atau kedua variabel menjadi float / double.

Jangan hanya mengubah hasil pembagian bilangan bulat menjadi dua kali lipat: pembagian sudah dilakukan sebagai pembagian bilangan bulat, jadi angka di belakang desimal sudah hilang.

Hans Ke st ing
sumber
4
+1 karena saya pikir Anda menjelaskannya sedikit lebih baik dan menyebutkan bahwa hanya satu nilai yang perlu menjadi float / double
Chaulky
11

Karena itu bilangan bulat. Anda perlu mendeklarasikannya sebagai angka atau desimal floating point, atau memasukkannya ke dalam perhitungan.


sumber
Jika saya mengubah variabel @weight menjadi float, apakah itu cukup?
Roch
10

Cukup gandakan bagian bawah pembagian dengan 1,0 (atau tempat desimal sebanyak yang Anda inginkan)

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight
HLGEM
sumber
Terima kasih sobat. Kode Anda membantu saya menjawab pertanyaan ini - stackoverflow.com/questions/20532187/… Dapatkah Anda memberi tahu saya cara memotong angka nol ekstra yang disebabkan oleh perkalian itu? Terima kasih.
Trojan.ZBOT
2

jika Anda mendeklarasikannya sebagai float atau format desimal apa pun, itu akan ditampilkan

0

hanya

Misal:

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

Keluaran: 0

Jika Anda menginginkan keluaran sebagai

0,073667712

Misalnya

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight
anishMarokey
sumber
Hum ok saya mengerti sekarang tetapi dua angka yang ingin saya bagi adalah variabel, dan tampaknya tidak berfungsi jika .0000 tidak ditentukan dalam variabel.
Roch
jadi Anda perlu mentransmisikan @ set1 dan @ set2 untuk mengapung :)
anishMarokey
1

Dalam SQL Server divisi langsung dari dua integer mengembalikan integer bahkan jika hasilnya harus float. Ada contoh di bawah ini untuk menyampaikannya:

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

Hanya blok terakhir akan mengembalikan 3,14285714285714. Meskipun blok kedua ditentukan dengan presisi yang tepat, hasilnya akan menjadi 3.00000.

Suat Atan PhD
sumber