2010-07-08 37 views

Trả lời

35

Sau đây sẽ hoạt động. Sau khi đọc câu hỏi của bạn, tôi không chắc chắn chính xác những gì bạn muốn 100 trở lại. Đối với điều này 100 lợi nhuận 100.

select floor((X + 99)/100) * 100; 

này cho kết quả như sau:

0 -> 0 
1 -> 100 
99 -> 100 
100 -> 100 
101 -> 200 
+0

Tôi cần một cái gì đó nếu C# để làm điều tương tự, và công thức trên hoạt động tốt. Vấn đề nhỏ duy nhất là không hoạt động nếu X là âm. Cách tôi cố định nó (không hoàn toàn chắc chắn về cú pháp SQL, nhưng nên dễ dàng tìm ra) là đảm bảo X luôn luôn dương (Abs (X)) và sau đó nhân với -100. –

+0

Xin lỗi để nói, nhưng câu trả lời này dường như chỉ hoạt động với các giá trị số nguyên. X = 100,25 vẫn cung cấp cho 100 thay vì làm tròn lên đến 200. @ Krock của trần trả lời hoạt động tốt hơn cho phao và số thập phân – bmadtiger

14

Một lựa chọn sẽ được sử dụng CEILING() chức năng như thế này:

SELECT CEILING(@value/100.0) * 100 

Bạn có thể cần phải chuyển đổi giá trị của bạn sang thập phân đầu tiên tùy thuộc vào loại của nó.

+0

này rõ ràng là câu trả lời hay nhất – ministry

+0

Điều này không phải lúc nào cũng tròn * UP *, như được chỉ định trong câu hỏi. Ví dụ 'SELECT ROUND (129.0/100, 0) * 100' trả về 100 thay vì 200. – Gyromite

+0

@Gyromite lạ rằng trang web tôi liên kết là đúng, nhưng tôi phải sao chép sai:/ – krock

0

Không có chức năng gốc nào sẽ thực hiện việc này, nhưng có một số thủ thuật toán học đơn giản sẽ có. Ví dụ:

DECLARE @Foo int 
SET @Foo = 720 

print @Foo 
print (@Foo + 100) % 100 
PRINT @Foo - (@Foo + 100) % 100 
+0

Điều này không phải lúc nào cũng tròn * UP *, như được chỉ định trong câu hỏi. Bạn ví dụ với 720 là đầu vào nên trả lại 800, nhưng thay vào đó nó trả về 700. – Gyromite

0

Bạn có thể sử dụng mã này, giả sử amount của bạn là int. Nếu không, bạn sẽ cần phải đúc, vì vậy bạn sẽ có được phân chia số nguyên.

If amount % 100 != 0 Then 
    roundedAmount = ((amount/100) * 100) + 100 
Else 
    roundedAmount = amount 

Bạn có thể muốn gói gói này vào một số user defined function.

7

Sử dụng chức năng TRẦN để làm tròn một con số lên

DECLARE @Number DECIMAL, @RoundUp DECIMAL 
SET @RoundUp = 100 
SET @Number = 720 
SELECT CEILING(@Number/@RoundUp)*@RoundUp 
17

cho làm tròn lên đến hàng nghìn gần nhất, xin vui lòng hãy thử các cách sau: -

select round(YourValue, -3) 

Chúc mừng !!!!!

+0

Điều này làm tròn xuống, không lên. Thử nó. chọn vòng (1005, -3) --result: 1000 – Sameer

0

Giải pháp chung - Sử dụng MOD để tìm vị trí thứ 100 cuối cùng và sau đó thêm 100 vào kết quả.

select (720 - MOD(720,100)) + 100 from dual; 

Nếu bạn cần vị trí thứ 80 tiếp theo, chỉ cần thay thế bất kỳ "100" bằng "80".

+0

Có vấn đề với công thức này khi giá trị đầu vào đã là bội số của 100. 'select (800 - (800% 100)) + 100;' bạn 900 thay vì 800. – Gyromite

3

Hãy thử điều này:

chọn tròn (@value, -2);

+0

Điều này không phải lúc nào cũng tròn * UP *, như được chỉ định trong câu hỏi. Ví dụ 'chọn vòng (129.0, -2);' trả về 100 thay vì 200. – Gyromite

0

Nó rất đơn giản để làm tròn một số đến bất kỳ bội số của gần 10 bằng cách sử dụng chỉ đơn giản là ROUND chức năng cho ví dụ:

SELECT ROUND(number/1000,2)*1000 

này sẽ cung cấp cho bạn giá trị phần nghìn gần nhất.

0

Ngoài Gray's câu trả lời, Tôi muốn sử dụng chức năng inline sau:

CREATE FUNCTION dbo.udf_RoundNearest 
(
@Number bigint, 
@RoundNearest bigint, 
@Direction int 
) 

RETURNS TABLE AS 
RETURN 

SELECT CASE WHEN @RoundNearest>[email protected] THEN @Number 
     ELSE 
     (
       (@Number + CASE 
          WHEN @Direction = 0 --Round Down 
          THEN 0 
          ELSE CASE WHEN @Number % @RoundNearest = 0 THEN 0 ELSE @RoundNearest END 
          END)/@RoundNearest) * @RoundNearest 

    END Number 

Parameter Định nghĩa:

  1. @number - số bạn cần để làm tròn
  2. @RoundNearest 10, 100, 1000, v.v.
  3. @Direction 0-> roundxuống, 1-> tròn

sử dụng chức năng:

SELECT * FROM dbo.udf_RoundNearest (1965,100,1) --> 2000 
SELECT * FROM dbo.udf_RoundNearest (1359,100,0) --> 1300 
SELECT * FROM dbo.udf_RoundNearest (1999,10,0) --1990 
SELECT * FROM dbo.udf_RoundNearest (80,100,0) --> 80 (if the @number parameter is less or equal the @RoundNearest parameter the result will be the @number itself 

nó cũng có thể được sử dụng như áp dụng nó so với một bảng như:

;with tmp (Value) as 
    (select 1236 union all select 6584 union all select 9999) 

    select t.*, fn.Number 
    from tmp t 
    cross apply dbo.udf_RoundNearest (Value,100,0) fn 

    /*Result Set 
    Value Number 
    1236 1200 
    6584 6500 
    9999 9900*/ 
Các vấn đề liên quan