تقريب رقم إلى أقرب 5 أو 10 أو X
سؤال
في ضوء أرقام مثل 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 (عدد، عشرية)
وبهذه الطريقة التقريب المصرفية أو المحاسبة لا تفعل التقريب.