2008-11-28 94 views
54

Với các số như 499, 73433, 2348, tôi có thể sử dụng VBA nào để làm tròn tới 5 hoặc 10 gần nhất? hoặc một số abitrary?Làm thế nào để làm tròn một số trong VBA đến 5 gần nhất? (hoặc 10 hoặc X)

By 5:

499 -> 500 
2348 -> 2350 
7343 -> 7345 

Bằng 10:

499 -> 500 
2348 -> 2350 
7343 -> 7340 

, vv

+0

Cảm ơn mọi người cho tất cả các câu trả lời của bạn. Tôi thông minh hơn cho nó. Xin lỗi tôi chỉ có thể đánh dấu một câu trả lời duy nhất là chính xác, vì câu trả lời "thực sự" nằm rải rác trên một vài thông điệp. –

+0

Điều này làm việc cho tôi http://www.tek-tips.com/faqs.cfm?fid=5031 – Ferroao

Trả lời

29

Integrated trả lời

X = 1234 'number to round 
N = 5 'rounding factor 
round(X/N)*N 'result is 1235 

Đối với dấu chấm động để nguyên, 1234.564-1235, (đây là VB cụ thể, hầu hết các ngôn ngữ khác chỉ đơn giản là cắt ngắn) làm:

int(1234.564) 'result is 1235 

Hãy coi chừng: VB sử dụng Bankers Rounding, khi nó vượt mức số chẵn, có thể là đáng ngạc nhiên nếu bạn không biết nó:

msgbox round(1.5) 'result to 2 
msgbox round(2.5) 'yes, result to 2 too 

Cảm ơn mọi người.

83

Nó đơn giản toán học. Cho một số X và một yếu tố làm tròn N, công thức sẽ là:

tròn (X/N) * N

10

Để tròn đến X gần nhất (mà không bị VBA cụ thể)

N = X * int (N/X + 0.5)

Trong đó int (...) trả về số nguyên thấp nhất tiếp theo.

Nếu chức năng làm tròn có sẵn của bạn đã vòng đến gần số nguyên sau đó bỏ qua việc bổ sung 0,5

+0

Chỉ cần làm rõ: 'int (N + 0.5)' là giống như 'vòng (N)' –

+0

có - Tôi đã thêm rằng cùng một lúc như bạn đã nhận xét :) – Alnitak

+0

+1: Cảm ơn vì điều này. –

0

một cái gì đó như thế?

'nearest 
n = 5 
'n = 10 

'value 
v = 496 
'v = 499 
'v = 2348 
'v = 7343 

'mod 
m = (v \ n) * n 

'diff between mod and the val 
i = v-m 


if i >= (n/2) then  
     msgbox m+n 
else 
     msgbox m 
end if 
0

Chỉ cần làm tròn (x/5) * 5 nên thực hiện công việc.

0

tôi không thể thêm bình luận vì vậy tôi sẽ sử dụng này

trong một vbs chạy đó và vui chơi tìm ra lý do tại sao 2 đưa ra một kết quả của 2

bạn không thể tin tưởng vòng

msgbox round(1.5) 'result to 2 
msgbox round(2.5) 'yes, result to 2 too 
+0

Tôi muốn nói rằng nó có liên quan đến cách thức các số dấu phẩy động được lưu trữ, hoặc thực hiện chính xác thuật toán làm tròn nổi bật trên thế giới. Tôi không biết tên của nó, nhưng nó đã được như vậy mà mọi người khác .5 được làm tròn xuống, và phần còn lại lên. –

+0

Làm tròn số vòng [sic] đến số chẵn gần nhất. Thậm chí còn có một lời giải thích ở đây trong SO. –

+0

Vilx, đề nghị của bạn là tốt, nhưng không phải cho vòng VBA (465/10) * 10 sẽ trả lại 460 – Fredou

1

Đối với một cách tiếp cận Visual Basic nghiêm ngặt, bạn có thể chuyển đổi giá trị dấu phẩy động thành một số nguyên để làm tròn số nguyên đã nói. VB là một trong những ngôn ngữ hiếm hoi làm tròn theo kiểu chuyển đổi (hầu hết các ngôn ngữ khác chỉ cắt ngắn.)

Các bội số của 5 hoặc x có thể được thực hiện đơn giản bằng cách chia trước và nhân sau vòng.

Nếu bạn muốn làm tròn và giữ vị trí thập phân, Math.round (n, d) sẽ hoạt động.

9

Trong VB, math.round có đối số bổ sung để chỉ định số chữ số thập phân và phương thức làm tròn. Math.Round (10.665, 2, MidpointRounding.AwayFromZero) sẽ trả lại 10,67. Nếu số là một kiểu dữ liệu thập phân hoặc dữ liệu đơn, math.round trả về một kiểu dữ liệu thập phân. Nếu nó là gấp đôi, nó trả về kiểu dữ liệu kép. Điều đó có thể quan trọng nếu tùy chọn nghiêm ngặt được bật.

Kết quả của (10.665) .ToString ("n2") làm tròn từ 0 để cho "10.67". mà không có đối số bổ sung math.round trả về 10.66, điều này có thể dẫn đến sự khác biệt không mong muốn.

0

Hãy thử chức năng này

-------------- bắt đầu ----------------

Function Round_Up(ByVal d As Double) As Integer 
    Dim result As Integer 
    result = Math.Round(d) 
    If result >= d Then 
     Round_Up = result 
    Else 
     Round_Up = result + 1 
    End If 
End Function 

------------- end ------------

2

'Ví dụ: Vòng 499 gần nhất 5. Bạn sẽ sử dụng hàm ROUND().

a = inputbox("number to be rounded") 
b = inputbox("Round to nearest _______ ") 


    strc = Round(A/B) 
    strd = strc*B 


msgbox(a & ", Rounded to the nearest " & b & ", is" & vbnewline & strd) 
-1

Để bắt chước trong Visual Basic cách hàm vòng làm việc trong Excel, bạn chỉ cần sử dụng: WorksheetFunction.Round (số, số thập phân)

Bằng cách này, làm tròn ngân hàng hoặc kế toán không làm tròn.

+0

Điều này sẽ không tròn 2348 đến 2350 theo yêu cầu trong câu hỏi (ví dụ thứ hai). – mins

1

Đây là giải pháp của chúng tôi:

Public Enum RoundingDirection 
    Nearest 
    Up 
    Down 
End Enum 

Public Shared Function GetRoundedNumber(ByVal number As Decimal, ByVal multiplier As Decimal, ByVal direction As RoundingDirection) As Decimal 
    Dim nearestValue As Decimal = (CInt(number/multiplier) * multiplier) 
    Select Case direction 
     Case RoundingDirection.Nearest 
      Return nearestValue 
     Case RoundingDirection.Up 
      If nearestValue >= number Then 
       Return nearestValue 
      Else 
       Return nearestValue + multiplier 
      End If 
     Case RoundingDirection.Down 
      If nearestValue <= number Then 
       Return nearestValue 
      Else 
       Return nearestValue - multiplier 
      End If 
    End Select 
End Function 

Cách sử dụng:

dim decTotal as Decimal = GetRoundedNumber(CDec(499), CDec(0.05), RoundingDirection.Up) 
+0

Tôi nghĩ rằng đây là VB.NET không VBA? Logic là hữu ích mặc dù! – tomRedox

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