2016-11-11 19 views
5

Something đã gây ra kết quả bất ngờ về công ty của tôi từ lâu, và tôi thấy vấn đề này:VB6 Round (x, 0) vấn đề

Dim k As Double 
Dim r As Integer 
k = 182.5 
r = Round(k,0) 

Kết quả của r là 182, điều này gây ra những vấn đề về công ty của tôi và bây giờ tôi phải sửa nó.

Cái này là tôi quan sát này:

Dim k As Double 
Dim r As Integer 
k = 186.5 
r = Round(k,0) 

r = 187

Khi unities của phần nguyên của các đôi có kích thước lớn hơn năm, Vòng làm những gì tôi mong đợi, nhưng nó doesn 't cho các số < = 5.

Làm thế nào tôi có thể giải quyết vấn đề này? Có chức năng nào khác để làm tròn đúng không?

+0

http://stackoverflow.com/questions/647762/automatic-type-conversion-in-visual-basic-6-0 – MarkJ

+0

Trong trường hợp này, tôi sẽ sử dụng 'r = int (k + 0.5)' – SBF

Trả lời

6

Điều này được gọi là ngân hàng làm tròn và cố gắng phân phối làm tròn lên/xuống trên .5 dựa trên số liệu gần nhất là số lẻ hay thậm chí.

Để làm tròn lên trên .5:

cint(format(182.5, "#0")) ''183 
cint(format(186.5, "#0")) ''187 
+0

Một nên lưu ý, tuy nhiên, định dạng $ chuyển đổi đôi thành một chuỗi, từ đó nó phải được chuyển đổi trở lại vào một Int. Điều này rất không hiệu quả. Định dạng (không có ký hiệu $) thậm chí còn tồi tệ hơn, bởi vì nó tạo ra một Biến thể. – Herb

1

Vâng, trước hết, nó không phải là quá như bạn nói.

k = 182.5 
r = Round(k, 0) 

thực sự sẽ sản xuất 182, nhưng

k = 186.5 
r = Round(k, 0) 

sẽ sản xuất 186, không phải 187 như bạn đề cập. Bây giờ,

k = 185.5 
r = Round(k, 0) 

cũng sẽ mang lại 186. Điều này được gọi là Banker's Rounding và là tiêu chuẩn trong VB6. Mục đích là để đảo ngược xu hướng luôn luôn làm tròn chính xác ở giữa.

Nếu bạn muốn luôn luôn vòng 0,5 lên, sử dụng

k = 186.5 
r = Int(k * 2 + 1) \ 2 

Nếu bạn muốn luôn luôn vòng 0,5 xuống, bạn có thể sử dụng một cái gì đó dọc theo dòng

k = 186.5 
r = Int(k * 2 + 0.99) \ 2 

Thêm vào làm nhiều 9s như có các chữ số có nghĩa sau dấu thập phân.