2008-10-24 15 views
8

tôi gặp khó khăn khi so sánh 2 đôi trong Excel VBAHãy so sánh đôi trong vấn đề chính xác VBA

giả sử rằng tôi có đoạn mã sau

Dim a as double 
Dim b as double 
a = 0.15 
b = 0.01 

Sau một vài thao tác trên b, b tại là tương đương với 0,6

tuy nhiên không chính xác liên quan đến các kiểu dữ liệu kép mang lại cho tôi đau đầu vì

if a = b then 
//this will never trigger 
end if 

Bạn có biết làm thế nào tôi có thể loại bỏ sự không chính xác theo sau trên kiểu kép?

Trả lời

13

Bạn không thể so sánh các giá trị dấu phẩy động cho bình đẳng. Xem bài viết này trên "Comparing floating point numbers" để thảo luận về cách xử lý lỗi nội tại.

Nó không đơn giản như so sánh với một lề lỗi không đổi trừ khi bạn biết chắc chắn phạm vi tuyệt đối của phao là gì trước.

+1

Để tham khảo khác, bạn có thể kiểm tra http://msdn.microsoft.com/en-us/ library/ae382yt8 (VS.80) .aspx – ZCHudson

3

Không bao giờ khôn ngoan để so sánh gấp đôi về bình đẳng.

Một số giá trị thập phân ánh xạ tới một số biểu diễn điểm nổi. Vì vậy, một 0,6 không phải lúc nào cũng bằng 0,6 khác.

Nếu chúng tôi trừ một cái kia, chúng tôi có thể nhận được một cái gì đó như 0.00000000051.

Bây giờ chúng tôi có thể xác định sự bình đẳng khi có sự khác biệt nhỏ hơn mà một biên độ lỗi nhất định.

1

Như đã được chỉ ra, nhiều số thập phân không thể được biểu diễn chính xác như các loại dấu phẩy động truyền thống. Tùy thuộc vào bản chất của không gian vấn đề của bạn, bạn có thể sử dụng loại VBA thập phân có thể biểu diễn các số thập phân (cơ số 10) với độ chính xác hoàn hảo đến một điểm thập phân nhất định. Điều này thường được thực hiện để đại diện cho tiền ví dụ như độ chính xác thập phân 2 chữ số thường được mong muốn.

Dim a as Decimal 
Dim b as Decimal 
a = 0.15 
b = 0.01 
+0

Có số thập phân trong vba không? Tôi nghĩ rằng bạn cần phải khai báo như là biến thể sau đó đúc để thập phân qua Cdec (myVar). –

1

Loại dữ liệu tiền tệ có thể là một lựa chọn tốt. Nó xử lý các con số tương đối lớn với độ chính xác bốn chữ số cố định.

3

nếu bạn đang đi để làm điều này ....

Dim a as double 
Dim b as double 
a = 0.15 
b = 0.01 

bạn cần phải thêm chức năng tròn trong bản Tuyên Bố NẾU bạn như thế này ...

If Round(a,2) = Round(b,2) Then 
    //code inside block will now trigger. 
    End If 

Xem thêm here for additional Microsoft reference.

2

Đây là một chức năng đơn giản, tôi đã viết:

Function dblCheckTheSame(number1 As Double, number2 As Double, Optional Digits As Integer = 12) As Boolean 

If (number1 - number2)^2 < (10^-Digits)^2 Then 
    dblCheckTheSame = True 
Else 
    dblCheckTheSame = False 
End If 

End Function 

Gọi nó với:

MsgBox dblCheckTheSame(1.2345, 1.23456789) 
MsgBox dblCheckTheSame(1.2345, 1.23456789, 4) 
MsgBox dblCheckTheSame(1.2345678900001, 1.2345678900002) 
MsgBox dblCheckTheSame(1.2345678900001, 1.2345678900002, 14)