سؤال

لدي مشكلة في مقارنة 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top