2009-04-06 38 views
22

Tôi có một bảng với một cột smallint có chứa tỷ lệ phần trăm như số nguyên (ví dụ, 50, 75, 85, vv)Tại sao SQL Server làm tròn kết quả của việc chia hai số nguyên?

Khi tôi chia cột này bởi 100, như trong

SELECT MY_COLUMN/100 AS PCT_AS_FRACTION 
FROM MY_TABLE 

sự kết quả được làm tròn đến số nguyên gần nhất. Ví dụ: Ví dụ, đối với một hàng có chứa số "50", tôi nhận được 0 là kết quả của tôi.

tôi có thể lặp lại điều này với một tuyên bố đơn giản:

SELECT 50/100 AS TEST_VALUE 

Tại sao vậy, và làm thế nào tôi có thể nhận được chính xác hơn trong kết quả của tôi?

Trả lời

32

Khi bạn thực hiện phân chia số nguyên (số nguyên chia cho số nguyên), bạn luôn nhận được câu trả lời nguyên. 50/100 = .50, là 0 trong số nguyên nói.

Bạn đã thử chia MY_COLUMN cho 100.0 chưa?

+2

Chia cho 100.0 hoạt động.Giải thích đơn giản cho một vấn đề đơn giản. Cảm ơn :) – JosephStyons

+0

Ngẫu nhiên, nhân 0,01 có tác dụng tương tự, và có lẽ là rõ ràng hơn. – JosephStyons

+0

Thuật ngữ 'số nguyên nói' cụ thể là * cắt ngắn *. '75/100' vẫn trả về' 0'. Định nghĩa là chỉ cần loại bỏ bất kỳ phần phân đoạn nào khỏi số. – Rabid

1

Bạn đang thực hiện phân chia số nguyên. 50/100 bằng 0 với số còn lại là 50.

Bạn cần sử dụng phân chia dấu phẩy động.

24

Truyền số nguyên.

SELECT (cast(50 AS float)/100) 
0

Bạn đang chia 2 số nguyên dẫn đến một số nguyên khác.

Cũng có thể truyền theo cách đó, quá

CHỌN (50/100) :: số;

+0

Điều đó dường như không hoạt động với MS SQL Server. – svick

1

NB - Hãy cẩn thận trong đó phần còn lại của số nguyên không được làm tròn. Thay vào đó, nó được giảm xuống. Điều này tương đương với việc gọi hàm FLLOR sql.

Điều này là phổ biến và được định nghĩa là vì khi nhân hai số nguyên, một phân số sẽ không bao giờ xảy ra. Do đó, một phương pháp xử lý phân số không bao giờ được giả định khi nhân các số nguyên, nhưng không thể nói cùng một phương thức cho phép chia số nguyên.

Điều này thường có thể có tác động khi thực hiện số học dateTime trong SQL.

1

Khi bạn đang sử dụng /(Divide) điều hành nó

Trả về kiểu dữ liệu của đối số với độ ưu tiên cao.

Nếu một cổ tức số nguyên được chia bởi một ước số nguyên, kết quả là một số nguyên có bất kỳ phần phân đoạn của các kết quả cắt ngắn.

Vì vậy, bạn cần phải truyền ít nhất một trong các toán hạng cho loại thích hợp: decimal and numeric hoặc float or real.

Các vấn đề liên quan