Số thập phân (không làm tròn) vị trí thập phân trong SQL Server


194

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

declare @value decimal(18,2)

set @value = 123.456

Điều này sẽ tự động làm tròn @valueđể được 123.46, đó là tốt trong hầu hết các trường hợp. 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 bớt số thập phân mà tôi không cần không? Tôi biết tôi có thể sử dụng left()hàm và chuyển đổi thành số thập phân. Có cách nào khác không?

Câu trả lời:


188
select round(123.456, 2, 1)

27
Câu trả lời sẽ giải thích các tham số của hàm là gì
Tyler

9
SQL ROUND (số, số thập phân, thao tác): phép toán -> Nếu 0, nó làm tròn kết quả thành số thập phân. Nếu giá trị khác 0, nó cắt kết quả thành số thập phân. Mặc định là 0
Midhun Darvin

bạn là một người bảo vệ cuộc sống, tôi đã có một số tiền chỉ hiển thị hai chữ số cuối cùng là "1.9991666", tuy nhiên nó luôn được làm tròn thành 2 bất kể tôi sử dụng cái gì, với điều này tôi có thể đạt được điều gì đó như thế này - chọn FORMAT (vòng (1.9991666 , 2, 1), 'N2') NHƯ 'Tỷ lệ', Cảm ơn người bạn đời
Spider

269
ROUND ( 123.456 , 2 , 1 )

Khi tham số thứ ba ! = 0, nó cắt bớt chứ không phải làm tròn

http://msdn.microsoft.com/en-us/l Library / ms175003 (MySQL.90) .aspx

Cú pháp

ROUND ( numeric_expression , length [ ,function ] )

Tranh luận

  • numeric_expression Là một biểu thức của loại dữ liệu số chính xác hoặc số gần đúng, ngoại trừ loại dữ liệu bit.

  • length Là độ chính xác mà số_expression sẽ được làm tròn. chiều 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, num_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, num_expression được làm tròn ở bên trái dấu thập phân, như được chỉ định theo độ dài.

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

Bất cứ ai cũng biết những giá trị nào cho đố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. msdn.microsoft.com/en-us/l Library / ms175003 (MySQL.90) .aspx
Dave

MS SQL SERVER làm tròn số khác một chút so với IQ. Để khắc phục, hãy sử dụng hàm round (x, y, z) như vòng này (val1 / val2,4,1)
Warren LaFrance

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

13

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

select 100.0019-(100.0019%.001)

trả lại 100.0010

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

select 123.456-(123.456%.001)

trả về 123.450

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

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

trả lại 123,45


10

Trên thực tế, bất kể tham số thứ ba là 0 hay 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))

Tôi không hiểu câu trả lời này. Kết quả SQL đã cho trong 10,01, đó là làm tròn chính xác từ 10,0055 đến hai chữ số thập phân. Nếu tham số cuối cùng không phải là 0, giá trị bị cắt ngắn (đến 2 chữ số thập phân) đến 10,00.
8128

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

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

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

7

Bạn có muốn 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ì thực hiện 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ữ các số thập phân, chỉ cần bỏ các vị trí mà tôi không muốn. Ví dụ, thay vì 123.456 trong ví dụ của tôi ở trên được chuyển đổi thành 123,46 ... Tôi muốn bỏ số thập phân thứ ba và biến nó thành 123,45.
Ryan Eastabrook

6

Một cắt ngắn khác không có giải pháp làm tròn và ví dụ.

    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 Floor()là cách để giảm số thập phân mà không làm tròn số thực sự. Quá xấu Tầng () không có tham số thứ hai để chỉ ra vị trí nào. Nhưng tôi nghĩ rằng * 10) / 10 hoạt động xung quanh điều này thực sự khá tốt.
deroby

4

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

SELECT ROUND(@val,0,1)

2
Nó không. CHỌN ROUND (123,4560,0,1) thay vào đó cung cấp cho bạn 123.0000.
remykarem

2
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

Sẽ cung cấp cho bạn 2 giá trị sau dấu thập phân. (MÁY CHỦ MS SQL)


1

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

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

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

LiveDemo

Đầu ra:

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

Ghi chú:

Tôi khuyên bạn nên sử dụng ROUNDchức năng tích hợp với tham số thứ 3 được đặt thành 1.


1
Hàm vô hướng ODBC - Thay thế khác nhau!
Arulmouzhi

1

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

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

Ví dụ của bạn:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

trả lại 123,45

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

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


0

Vui lòng thử sử dụng mã này để chuyển đổi 3 giá trị thập phân sau một điểm thành 2 vị trí thập phân:

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

select @val

Đầu ra là 123,46


1) Dòng thứ 3 là hoàn toàn không cần thiết 2) anh ta nói rõ ràng rằng anh ta không muốn làm tròn số, nhưng cắt ngắn nó (kết quả sẽ là 123,45)
Damián Pablo González

0

Tôi nghĩ bạn chỉ muốn 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)

0

Tôi biết câu hỏi này thực sự cũ nhưng không ai sử dụng chuỗi phụ để làm tròn. Đây là lợi thế của khả năng làm tròn số thực sự dài (giới hạn chuỗi của bạn trong máy chủ SQL thường là 8000 ký tự):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

0

Tôi nghĩ rằng chúng ta có thể dễ dàng hơn nhiều với giải pháp ví dụ đơn giản hơn được tìm thấy trong Hackerrank:

Báo cáo sự cố: Truy vấn giá trị lớn nhất của vĩ độ phía Bắc (LAT_N) từ STATION nhỏ hơn 137,2345. Cắt câu trả lời của bạn đến 4 chữ số thập phân.

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

Giải pháp trên cho bạn ý tưởng làm thế nào để đơn giản làm cho giá trị giới hạn ở 4 điểm thập phân. Nếu bạn muốn hạ hoặc tăng các số sau số thập phân, chỉ cần thay đổi 4 thành bất cứ điều gì bạn muốn.


-3

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


-5
select convert(int,@value)

1
Đây không phải là những gì OP muốn. Anh ta vẫn muốn vị trí thập phân, nhưng anh ta muốn loại bỏ chúng (truncte) hơn là làm tròn chúng. IE 123.456 -> 123,45 KHÔNG 123.456 -> 12.46 và KHÔNG 123.456 -> 123
John
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.