سؤال

في ضوء أرقام مثل 499، 73433، 2348، ما الذي يمكنني استخدامه لـ VBA للتقريب إلى أقرب 5 أو 10؟أو رقم تعسفي؟

بحلول 5:

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

بحلول الساعة 10:

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

إلخ.

هل كانت مفيدة؟

المحلول 2

الإجابة المتكاملة

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

لتحويل النقطة العائمة إلى عدد صحيح، من 1234.564 إلى 1235، (وهذا خاص بـ VB، ويتم اقتطاع معظم اللغات الأخرى ببساطة):

int(1234.564)   'result is 1235

احذر: استخدامات لغة VB تقريب المصرفيين, ، إلى أقرب رقم زوجي، وهو ما قد يكون مفاجئًا إذا لم تكن على علم به:

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

شكرا لكل شخص.

نصائح أخرى

وانها الرياضيات البسيطة. إعطاء X عدد والتقريب عامل N، تكون الصيغة:

وعلى مدار (X / N) * N

للتقريب إلى أقرب X (دون أن يكون محددًا لـ VBA)

ن = X * كثافة العمليات (N / X + 0.5)

حيث يقوم int(...) بإرجاع الرقم الصحيح التالي الأدنى.

إذا كانت وظيفة التقريب المتاحة لديك تقوم بالفعل بالتقريب إلى الأقرب عدد صحيح ثم حذف إضافة 0.5

في VB، يحتوي math.round على وسائط إضافية لتحديد عدد المنازل العشرية وطريقة التقريب. Math.Round(10.665, 2, MidpointRounding.AwayFromZero) سيعود 10.67 .إذا كان الرقم عبارة عن نوع بيانات عشري أو فردي، فستُرجع math.round نوع بيانات عشري.إذا كان مزدوجًا، فإنه يُرجع نوع بيانات مزدوجًا.قد يكون ذلك مهمًا إذا كان الخيار صارم قيد التشغيل.

يتم تقريب نتيجة (10.665).ToString("n2") بعيدًا عن الصفر لتعطي "10.67".بدون وسيطات إضافية، تقوم math.round بإرجاع 10.66، مما قد يؤدي إلى تناقضات غير مرغوب فيها.

'مثال: جولة 499 إلى أقرب 5. أنت لن تستخدم الدالة 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)

لنهج صارم ل Visual Basic، يمكنك تحويل قيمة نقطة عائمة إلى عدد صحيح تقريبه إلى عدد صحيح قال. VB هي واحدة من اللغات النادرة التي جولات على نوع التحويل (معظم الآخرين ببساطة اقتطاع.)

ومضاعفات 5 أو x يمكن أن يتم ببساطة بقسمة قبل والتكاثر بعد الجولة.

إذا كنت تريد تقريبه والحفاظ على المنازل العشرية، Math.round (ن، د) ستعمل.

وهنا لدينا الحل:

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

والاستعمال:

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

وببساطة ROUND (خ / 5) * 5 ينبغي القيام بهذه المهمة.

وأنا لا يمكن أن تضيف تعليق ولذا فإنني سوف تستخدم هذا

وفي فبس تشغيل ذلك والمتعة معرفة لماذا 2 تعطي نتيجة من 2

لا يمكن الثقة مستديرة

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

وشيء من هذا القبيل؟

'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

جرب هذه الوظيفة

و-------------- بدء ----------------

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

و------------- نهاية ------------

لقد قمت بتحديث الوظيفة التي يوفرها "مجتمع wiki" قليلاً (أفضل إجابة)، فقط للتقريب إلى أقرب 5 (أو أي شيء تريده)، مع هذا الاستثناء: لن يكون الرقم المقرب أبدًا أعلى من الرقم الأصلي.

وهذا مفيد في الحالات التي يلزم فيها قول ذلك "الشركة على قيد الحياة لمدة 47 عامًا" :أريد أن تظهر صفحة الويب "يعيش منذ أكثر من 45 عامًا", مع تجنب الكذب في القول "يعيش منذ أكثر من 50 عامًا".

لذا، عندما تغذي هذه الدالة بالرقم 47، فإنها لن تُرجع 50، ولكنها ستعيد 45 بدلاً من ذلك.

'Rounds a number to the nearest unit, never exceeding the actual value
function RoundToNearestOrBelow(num, r)

    '@param         num         Long/Integer/Double     The number to be rounded
    '@param         r           Long                    The rounding value
    '@return        OUT         Long                    The rounded value

    'Example usage :
    '   Round 47 to the nearest 5 : it will return 45
    '   Response.Write RoundToNearestBelow(47, 5)

    Dim OUT : OUT = num

    Dim rounded : rounded = Round((((num)) / r), 0) * r

    if (rounded =< num) then
        OUT = rounded
    else
        OUT = rounded - r
    end if

    'Return
    RoundToNearestOrBelow = OUT

end function 'RoundToNearestOrBelow

لتقليد في Visual Basic طريقة عمل وظيفة مستديرة في Excel، لديك فقط لاستخدام: WorksheetFunction.Round (عدد، عشرية)

وبهذه الطريقة التقريب المصرفية أو المحاسبة لا تفعل التقريب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top