2008-09-04 73 views
158

Tôi đang cố gắng xác định cách tốt nhất để cắt bớt hoặc thả các số thập phân bổ sung trong SQL mà không làm tròn. Ví dụ:Cắt ngắn (không tròn) số thập phân trong SQL Server

declare @value decimal(18,2) 

set @value = 123.456 

Điều này sẽ tự động tròn @Value là 123,46 .... trong hầu hết các trường hợp đều tốt. Tuy nhiên, đối với dự án này tôi không cần điều đó. Có cách nào đơn giản để cắt ngắn các số thập phân mà tôi không cần? Tôi biết tôi có thể sử dụng các chức năng left() và chuyển đổi trở lại một số thập phân ... bất kỳ cách nào khác?

Trả lời

159
select round(123.456, 2, 1) 
-3
select convert(int,@value) 
+1

Đây không phải là điều mà OP muốn.Anh ta vẫn muốn số thập phân, nhưng anh ta muốn loại bỏ chúng (truncte) thay vì làm tròn chúng. I E. 123.456 -> 123.45 NOT 123.456 -> 12.46 và NOT 123.456 -> 123 – John

4

Bạn có muốn chữ số thập phân hay không?

Nếu không, sử dụng

select ceiling(@value),floor(@value) 

Nếu bạn làm điều đó với 0 thì làm một vòng:

select round(@value,2) 
+1

Xin lỗi nếu tôi không rõ ràng, tôi cần giữ số thập phân, chỉ cần thả những thứ mà tôi không muốn. Ví dụ: thay vì 123.456 trong ví dụ trên của tôi đang được chuyển đổi thành 123,46 ... Tôi muốn thả số thập phân thứ ba và đặt số 123.45. –

209
ROUND (123.456 , 2 , 1) 

Khi tham số thứ ba = 0 nó truncates chứ không phải đạn!

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

Cú pháp

ROUND (numeric_expression, chiều dài [, chức năng])

Arguments

  • numeric_expression là một biểu hiện của sự chính xác số hoặc xấp xỉ dữ liệu số loại danh mục, ngoại trừ loại dữ liệu bit.

  • chiều dài Độ chính xác mà số_expression sẽ được làm tròn. độ dài phải là biểu thức của loại tinyint, smallint hoặc int. Khi độ dài là số dương, số_expression được làm tròn thành số vị trí thập phân được chỉ định theo độ dài. Khi độ dài là số âm, số_expression được làm tròn ở bên trái của dấu thập phân, như được chỉ định theo độ dài.

  • chức năng Là loại hoạt động cần thực hiện. hàm phải là tinyint, smallint hoặc int. Khi hàm bị bỏ qua hoặc có giá trị là 0 (mặc định), numeric_expression được làm tròn. Khi một giá trị khác 0 được chỉ định, numeric_expression bị cắt bớt.
+0

Bất kỳ ai biết giá trị nào của đối số hàm tương ứng với tinyint, smallint và int? Microsoft đã bỏ phần đó ra khỏi tài liệu của họ và không thể tìm thấy câu trả lời ở bất cứ đâu. https://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx – Dave

+0

Số vòng MS SQL SERVER hơi khác so với chỉ số IQ. Để sửa lỗi sử dụng hàm tròn (x, y, z) như thế này vòng (val1/val2,4,1) –

11

Đây là cách tôi đã có thể cắt ngắn và không tròn:

select 100.0019-(100.0019%.001) 

lợi nhuận 100,0010

Và ví dụ của bạn:

select 123.456-(123.456%.001) 

trả 123.450

Bây giờ nếu bạn muốn thoát khỏi những kết thúc không, chỉ cần cast nó:

select cast((123.456-(123.456%.001)) as decimal (18,2)) 

lợi nhuận 123,45

5

Một cắt ngắn không có giải pháp làm tròn và gương sáng.

Convert 71.950005666 to a single decimal place number (71.9) 
    1) 71.950005666 * 10.0 = 719.50005666 
    2) Floor(719.50005666) = 719.0 
    3) 719.0/10.0 = 71.9 

    select Floor(71.950005666 * 10.0)/10.0 
+2

+1 cho 'Tầng()' là cách để giảm số thập phân mà không làm tròn. Tầng quá xấu() không có thông số thứ hai để chỉ ra vị trí nào. Nhưng tôi nghĩ rằng các * 10)/10 hoạt động xung quanh này khá tốt thực sự. – deroby

26
SELECT Cast(Round(123.456,2,1) as decimal(18,2)) 
0

Hãy cố gắng sử dụng mã này để chuyển đổi 3 giá trị thập phân sau khi một điểm vào 2 chữ số thập phân:

declare @val decimal (8, 2) 
select @val = 123.456 
select @val = @val 

select @val 

Đầu ra là 123,46

-3

Mod(x,1) là cách dễ nhất tôi suy nghĩ.

+0

Tại sao bạn nghĩ vậy? –

7

Vòng có một tham số tùy chọn

Select round(123.456, 2, 1) will = 123.45 
Select round(123.456, 2, 0) will = 123.46 
+1

Chọn vòng (123.456, 2, 1) sẽ = 123.450 – Bikram

+0

Tôi không thấy lý do tại sao điều này được upvotes. Ở trên sẽ cung cấp cho bạn 123.450 và 123.460 tương ứng. –

0

Tôi nghĩ rằng bạn muốn chỉ có giá trị thập phân, trong trường hợp này bạn có thể sử dụng như sau:

declare @val decimal (8, 3) 
SET @val = 123.456 

SELECT @val - ROUND(@val,0,1) 
3

này sẽ loại bỏ các phần thập phân của bất kỳ số

SELECT ROUND(@val,0,1) 
+0

Nó không. SELECT ROUND (123.4560,0,1) cung cấp cho bạn 123.0000 thay thế. –

8

Thực tế là tham số thứ ba là 0 hoặc 1 hoặc 2, nó sẽ không làm tròn giá trị của bạn.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2)) 
+1

Vòng duy nhất không hoạt động. Cast đã hoạt động. Tuyệt quá. –

+0

Đó là một. Cảm ơn! –

+0

Trong tất cả các câu trả lời, đây là câu trả lời đúng. –

0

Một cách khác là ODBC TRUNCATE chức năng:

DECLARE @value DECIMAL(18,3) =123.456; 

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result 

LiveDemo

Output:

╔═════════╦═════════╗ 
║ val ║ result ║ 
╠═════════╬═════════╣ 
║ 123,456 ║ 123,450 ║ 
╚═════════╩═════════╝ 

Ghi chú:

tôi khuyên bạn nên sử dụng built-in ROUND chức năng với thiết lập tham số thứ 3 để 1.

0

Tôi biết điều này là khá muộn nhưng tôi không xem nó như là một câu trả lời và đã được sử dụng thủ thuật này cho năm.

Chỉ cần trừ 0,005 khỏi giá trị của bạn và sử dụng Vòng (@ num, 2).

dụ của bạn:

declare @num decimal(9,5) = 123.456 

select round(@num-.005,2) 

lợi nhuận 123,45

Nó sẽ tự động điều chỉnh làm tròn đến giá trị chính xác bạn đang tìm kiếm.

Nhân tiện, bạn có đang tạo lại chương trình từ bộ phim Office Space không?

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