مقارنة مزدوجة في مشكلة الدقة VBA
-
04-07-2019 - |
سؤال
لدي مشكلة في مقارنة 2 مزدوج في Excel VBA
لنفترض أن لدي الكود التالي
Dim a as double
Dim b as double
a = 0.15
b = 0.01
وبعد إجراء بعض التعديلات على b، أصبح b يساوي الآن 0.6
لكن عدم الدقة المتعلقة بنوع البيانات المزدوج يسبب لي الصداع بسبب
if a = b then
//this will never trigger
end if
هل تعرف كيف يمكنني إزالة عدم الدقة الزائدة على النوع المزدوج؟
المحلول
وأنت لا يمكن المقارنة بين القيم النقطة العائمة من أجل المساواة. انظر هذه المادة على " مقارنة أرقام النقطة العائمة "لمناقشة كيفية التعامل مع خطأ جوهري.
وانها ليست بهذه البساطة مقارنة مع هامش خطأ ثابت إلا إذا كنت تعرف على وجه اليقين ما مجموعة المطلق للعوامات هو مسبقا.
نصائح أخرى
وإذا كنت تنوي القيام به هذا ....
Dim a as double
Dim b as double
a = 0.15
b = 0.01
وتحتاج إلى إضافة وظيفة مستديرة في بيان IF الخاصة بك مثل هذا ...
If Round(a,2) = Round(b,2) Then
//code inside block will now trigger.
End If
وانظر أيضا هنا لإضافيا مايكروسوفت إشارة .
وانها ليست ابدا من الحكمة لمقارنة الزوجي على المساواة.
وبعض القيم العشرية الخريطة لعدة تمثيل النقطة العائمة. حتى واحد 0.6 ليست دائما يساوي 0.6 الآخرين.
إذا طرحنا واحد من الآخر، ونحن على الارجح الحصول على شيء من هذا القبيل 0.00000000051.
ويمكننا الآن تحديد المساواة وجود فرق أصغر أن هامش خطأ معين.
وهنا هو وظيفة بسيطة كتبت:
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
ويطلق عليه بما يلي:
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)
وكما أشير إلى ذلك، العديد من الأرقام العشرية لا يمكن أن تكون ممثلة على وجه التحديد إلى أنواع الفاصلة العائمة التقليدية. تبعا لطبيعة الفضاء مشكلتك، قد تكون أفضل حالا باستخدام نوع عشري VBA التي يمكن أن تمثل الأرقام العشرية (قاعدة 10) بدقة متناهية تصل إلى نقطة عشري معينة. ويتم ذلك غالبا لتمثيل المال على سبيل المثال حيث غالبا ما هو المطلوب 2-أرقام عشرية الدقة.
Dim a as Decimal
Dim b as Decimal
a = 0.15
b = 0.01
قد يكون نوع البيانات العملة بديل جيد. أنه يتعامل مع أعداد كبيرة نسبيا مع أربعة أرقام ثابتة الدقة.
العمل بشكل دائري؟؟لست متأكدًا مما إذا كان هذا سيجيب على جميع السيناريوهات، لكنني واجهت مشكلة في مقارنة القيم المزدوجة المقربة في VBA.عندما قمت بمقارنة الأرقام التي بدت متطابقة بعد التقريب، فإن VBA سيؤدي إلى ظهور خطأ في عبارة if-then قارن.كان الإصلاح الذي قمت به هو إجراء تحويلين، أولًا مضاعفة إلى سلسلة، ثم سلسلة لمضاعفة، ثم إجراء المقارنة.
مثال محاكاةلم أسجل الأرقام الدقيقة التي تسببت في الخطأ المذكور في هذا المنشور، والمبالغ الموجودة في المثال الخاص بي لا تؤدي إلى حدوث المشكلة حاليًا وتهدف إلى تمثيل نوع المشكلة.
Sub Test_Rounded_Numbers()
Dim Num1 As Double
Dim Num2 As Double
Let Num1 = 123.123456789
Let Num2 = 123.123467891
Let Num1 = Round(Num1, 4) '123.1235
Let Num2 = Round(Num2, 4) '123.1235
If Num1 = Num2 Then
MsgBox "Correct Match, " & Num1 & " does equal " & Num2
Else
MsgBox "Inccorrect Match, " & Num1 & " does not equal " & Num2
End If
'Here it would say that "Inccorrect Match, 123.1235 does not equal 123.1235."
End Sub
Sub Fixed_Double_Value_Type_Compare_Issue()
Dim Num1 As Double
Dim Num2 As Double
Let Num1 = 123.123456789
Let Num2 = 123.123467891
Let Num1 = Round(Num1, 4) '123.1235
Let Num2 = Round(Num2, 4) '123.1235
'Add CDbl(CStr(Double_Value))
'By doing this step the numbers
'would trigger if they matched
'100% of the time
If CDbl(CStr(Num1)) = CDbl(CStr(Num2)) Then
MsgBox "Correct Match"
Else
MsgBox "Inccorrect Match"
End If
'Now it says Here it would say that "Correct Match, 123.1235 does equal 123.1235."
End Sub