[Excel] كيفية جولة في مس أسيس، فبا


Answers

لتوسيع قليلا على الإجابة المقبولة:

"وظيفة جولة يؤدي جولة إلى حتى، والذي يختلف من جولة إلى أكبر".
--مايكروسوفت

تنسيق يقترب دائما.

  Debug.Print Round(19.955, 2)
  'Answer: 19.95

  Debug.Print Format(19.955, "#.00")
  'Answer: 19.96

ACC2000: أخطاء التقريب عند استخدام أرقام النقطة العائمة: http://support.microsoft.com/kb/210423

ACC2000: كيفية تقريب رقم لأعلى أو لأسفل بواسطة زيادة مطلوبة: http://support.microsoft.com/kb/209996

جولة وظيفة: http://msdn2.microsoft.com/en-us/library/se6f2zfx.aspx

كيفية تنفيذ إجراءات التقريب المخصصة: http://support.microsoft.com/kb/196652

Question

ما هي أفضل طريقة لجولة في الوصول فبا؟

يستخدم الأسلوب الحالي طريقة إكسيل

Excel.WorksheetFunction.Round(...

ولكن أبحث عن وسيلة لا تعتمد على إكسيل.




إذا كنت تتحدث عن التقريب إلى قيمة عدد صحيح (وليس التقريب إلى المنازل العشرية)، فهناك دائما طريقة المدرسة القديمة:

return int(var + 0.5)

(يمكنك جعل هذا العمل ل n المنازل العشرية أيضا، لكنه يبدأ للحصول على فوضوي قليلا)




VBA.Round(1.23342, 2) // will return 1.23



لسوء الحظ، فإن وظائف فبا الأصلية التي يمكن أن تؤدي تقريب إما مفقودة، محدودة، غير دقيقة، أو عربات التي تجرها الدواب، ولكل عناوين فقط طريقة التقريب واحدة. الاتجاه الصعودي هو أنها سريعة، والتي قد تكون في بعض الحالات مهمة.

ومع ذلك، غالبا ما تكون الدقة إلزامية، ومع سرعة أجهزة الكمبيوتر اليوم، قليلا من الصعب معالجة بطيئة لاحظت، في الواقع ليس لمعالجة القيم الفردية. وتبدأ جميع الوظائف في الوصلات أدناه عند حوالي 1 μs.

يمكن العثور على مجموعة كاملة من الوظائف - لجميع أساليب التقريب الشائعة، وجميع أنواع البيانات من فبا، عن أي قيمة، وعدم إرجاع قيم غير متوقعة هنا:

تقريب القيم صعودا وهبوطا، 4/5، أو إلى أرقام كبيرة (إي)

أو هنا:

تقريب القيم صعودا وهبوطا، 4/5، أو إلى أرقام كبيرة (كوديبلكس)

رمز فقط في جيثب:

VBA.Round

وهي تغطي طرق التقريب العادية:

  • جولة لأسفل، مع خيار لجولة القيم السلبية نحو الصفر

  • تقريب، مع خيار لجولة القيم السلبية بعيدا عن الصفر

  • الجولة 4/5، إما بعيدا عن الصفر أو حتى (بانكر تقريب)

  • جولة إلى عدد من الشخصيات الهامة

تقبل الدالات الثلاث الأولى جميع أنواع البيانات الرقمية بينما آخرها موجود في ثلاثة أصناف - للعملة والعشرية والمزدوجة على التوالي.

انهم جميعا قبول عدد محدد من الكسور العشرية - بما في ذلك العد السلبي الذي سوف جولة إلى عشرات، مئات، الخ تلك مع المتغير كنوع العودة سيعود نول لإدخال غير مفهومة

يتم تضمين وحدة اختبار للاختبار والتحقق من صحة كذلك.

مثال هنا - للتقريب المشترك 4/5. يرجى دراسة التعليقات في خط التفاصيل الدقيقة والطريقة التي يستخدمها كديك لتجنب أخطاء البتات.

' Common constants.
'
Public Const Base10     As Double = 10

' Rounds Value by 4/5 with count of decimals as specified with parameter NumDigitsAfterDecimals.
'
' Rounds to integer if NumDigitsAfterDecimals is zero.
'
' Rounds correctly Value until max/min value limited by a Scaling of 10
' raised to the power of (the number of decimals).
'
' Uses CDec() for correcting bit errors of reals.
'
' Execution time is about 1µs.
'
Public Function RoundMid( _
    ByVal Value As Variant, _
    Optional ByVal NumDigitsAfterDecimals As Long, _
    Optional ByVal MidwayRoundingToEven As Boolean) _
    As Variant

    Dim Scaling     As Variant
    Dim Half        As Variant
    Dim ScaledValue As Variant
    Dim ReturnValue As Variant

    ' Only round if Value is numeric and ReturnValue can be different from zero.
    If Not IsNumeric(Value) Then
        ' Nothing to do.
        ReturnValue = Null
    ElseIf Value = 0 Then
        ' Nothing to round.
        ' Return Value as is.
        ReturnValue = Value
    Else
        Scaling = CDec(Base10 ^ NumDigitsAfterDecimals)

        If Scaling = 0 Then
            ' A very large value for Digits has minimized scaling.
            ' Return Value as is.
            ReturnValue = Value
        ElseIf MidwayRoundingToEven Then
            ' Banker's rounding.
            If Scaling = 1 Then
                ReturnValue = Round(Value)
            Else
                ' First try with conversion to Decimal to avoid bit errors for some reals like 32.675.
                ' Very large values for NumDigitsAfterDecimals can cause an out-of-range error 
                ' when dividing.
                On Error Resume Next
                ScaledValue = Round(CDec(Value) * Scaling)
                ReturnValue = ScaledValue / Scaling
                If Err.Number <> 0 Then
                    ' Decimal overflow.
                    ' Round Value without conversion to Decimal.
                    ReturnValue = Round(Value * Scaling) / Scaling
                End If
            End If
        Else
            ' Standard 4/5 rounding.
            ' Very large values for NumDigitsAfterDecimals can cause an out-of-range error 
            ' when dividing.
            On Error Resume Next
            Half = CDec(0.5)
            If Value > 0 Then
                ScaledValue = Int(CDec(Value) * Scaling + Half)
            Else
                ScaledValue = -Int(-CDec(Value) * Scaling + Half)
            End If
            ReturnValue = ScaledValue / Scaling
            If Err.Number <> 0 Then
                ' Decimal overflow.
                ' Round Value without conversion to Decimal.
                Half = CDbl(0.5)
                If Value > 0 Then
                    ScaledValue = Int(Value * Scaling + Half)
                Else
                    ScaledValue = -Int(-Value * Scaling + Half)
                End If
                ReturnValue = ScaledValue / Scaling
            End If
        End If
        If Err.Number <> 0 Then
            ' Rounding failed because values are near one of the boundaries of type Double.
            ' Return value as is.
            ReturnValue = Value
        End If
    End If

    RoundMid = ReturnValue

End Function



إنت وإصلاح في كل من وظائف التقريب مفيدة، والتي تعطيك جزء صحيح من عدد.

إنت دائما جولات أسفل - إنت (3.5) = 3، إنت (-3.5) = -4

إصلاح دائما جولات نحو الصفر - إصلاح (3.5) = 3، إصلاح (-3.5) = -3

وهناك أيضا وظائف الإكراه، ولا سيما سنت و كلنغ، التي تحاول إجبار عدد على عدد صحيح أو نوع طويل (عدد صحيح بين -32،768 و 32،767، تتراوح بين 2،147،483،648 و 2،147،483،647). وسوف تقترب كلاهما من أقرب عدد صحيح، تقريب بعيدا عن الصفر من .5 - سنت (3.5) = 4، سنت (3.49) = 3، سنت (-3.5) = -4، الخ.




لقد استخدمت وظيفة بسيطة التالية لجولة العملات الخاصة بي كما هو الحال في شركتنا ونحن دائما مستديرة.

Function RoundUp(Number As Variant)
   RoundUp = Int(-100 * Number) / -100
   If Round(Number, 2) = Number Then RoundUp = Number
End Function

ولكن هذا سوف الجولة دائما تصل إلى 2 الكسور العشرية، وربما أيضا خطأ.

حتى لو كان سلبيا سوف تقترب (-1.011 سيكون -1.01 و 1.011 سيكون 1.02)

وذلك لتوفير المزيد من الخيارات لتقريب (أو لأسفل للسلبية) هل يمكن استخدام هذه الوظيفة:

Function RoundUp(Number As Variant, Optional RoundDownIfNegative As Boolean = False)
On Error GoTo err
If Number = 0 Then
err:
    RoundUp = 0
ElseIf RoundDownIfNegative And Number < 0 Then
    RoundUp = -1 * Int(-100 * (-1 * Number)) / -100
Else
    RoundUp = Int(-100 * Number) / -100
End If
If Round(Number, 2) = Number Then RoundUp = Number
End Function

(المستخدمة في وحدة نمطية، إذا لم يكن واضحا)




Links