Đây là mã tôi đang sử dụng trong ví dụ:
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2;
PRINT @weight
Đây là kết quả:
47
638
0
Tôi muốn biết tại sao nó quay trở lại 0
thay vì0,073667712
Câu trả lời:
Khi bạn chỉ sử dụng số nguyên trong một phép chia, bạn sẽ nhận được phép chia số nguyên. Khi bạn sử dụng (ít nhất một) double hoặc float, bạn sẽ nhận được phép chia dấu phẩy động (và câu trả lời bạn muốn nhận).
Vì vậy, bạn có thể
Đừng chỉ chuyển kết quả của phép chia số nguyên thành nhân đôi: phép chia đã được thực hiện như phép chia số nguyên, vì vậy các số phía sau số thập phân đã bị mất.
Bởi vì nó là một số nguyên. Bạn cần khai báo chúng dưới dạng số dấu phẩy động hoặc số thập phân, hoặc ép kiểu như vậy trong phép tính.
Đơn giản chỉ cần rút gọn phần dưới cùng của phép chia cho 1,0 (hoặc bao nhiêu chữ số thập phân tùy thích)
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2 *1.00000;
PRINT @weight
nếu bạn khai báo nó dưới dạng float hoặc bất kỳ định dạng thập phân nào, nó sẽ hiển thị
0
chỉ có
Ví dụ :
declare @weight float;
SET @weight= 47 / 638; PRINT @weight
Đầu ra: 0
Nếu bạn muốn đầu ra là
0,073667712
Ví dụ
declare @weight float;
SET @weight= 47.000000000 / 638.000000000; PRINT @weight
Trong SQL Server phép chia trực tiếp hai số nguyên trả về số nguyên ngay cả khi kết quả phải là số thực. Có một ví dụ dưới đây để hiểu rõ hơn:
--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
Chỉ khối cuối cùng sẽ trả về 3,14285714285714. Mặc dù khối thứ hai được xác định với độ chính xác phù hợp, kết quả sẽ là 3,00000.