SQL Server, phép chia trả về 0


86

Đâ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 0thay vì0,073667712


nó là một 'int': DECLARE @weight INT
Roch

Câu trả lời:


152

Khai báo set1 và set2 dưới dạng float thay vì số nguyên hoặc ép chúng thành float như một phần của phép tính:

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

24

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ể

  1. khai báo một hoặc cả hai biến dưới dạng float / double
  2. ép kiểu một hoặc cả hai biến thành float / double.

Đừ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.


4
1 bởi vì tôi nghĩ rằng bạn đã giải thích nó tốt hơn một chút và nói rằng chỉ có một trong những nhu cầu giá trị là một phao / đôi
Chaulky

11

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ếu tôi thay đổi biến @weight thành float, liệu có đủ không?
Roch

10

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

Cảm ơn anh bạn. Mã của bạn đã giúp tôi trả lời câu hỏi này - stackoverflow.com/questions/20532187/… Bạn có thể cho tôi biết cách cắt bớt số 0 thừa do phép nhân đó gây ra không? Cảm ơn.
Trojan.ZBOT 12/1213

2

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

Hum ok, tôi đã nhận được nó ngay bây giờ nhưng hai số tôi muốn chia là các biến và nó có vẻ không hoạt động nếu .0000 không được chỉ định trong biến.
Roch

vì vậy bạn cần phải cast cả @ set1 và @ set2 để float :)
anishMarokey

1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.