Abstract

Wie wahrscheinlich ist es, dass die Summe von gerundeten Werten nicht gleich ihrer gerundeten Summe ist?

Für zwei zufällige Gleitkommazahlen ist dies klar: die Wahrscheinlichkeit liegt bei etwa 25% - das ist der Rot-Anteil an der Gesamtfläche:

Zwei Werte

Aber etwas überraschend mag sein, dass die Wahrscheinlichkeit sich 90% nähert, je mehr Zahlen gerundet und addiert werden:

Werte runden ändert ihre Summe

Bei sieben zufälligen Gleitkommazahlen ist die Wahrscheinlichkeit bereits größer als 50%, dass die Summe ihrer gerundeten Werten nicht gleich ihrer gerundeten Summe ist.

Wie kann man diese Problematik lösen? Verwenden Sie RoundToSum.

Gerundete Prozentanteile

Gerundete Prozentanteile ergeben addiert auch häufig nicht 100%.

Bei zwei zufälligen Zahlen ist es noch kein Problem:

Two Values

Aber bei mehr Zahlen stellt sich dasselbe Problem wie eingangs erwähnt, nur mit einer Zahl mehr. Gerundete Prozentanteile von drei zufälligen Zahlen ergeben in etwa 25% der Fälle keine Summe von 1:

Percentage Values not adding up to 1

Hier ist bei acht Zufallszahlen die Wahrscheinlichkeit größer als 50%, dass ihre gerundeten Prozentanteile zusammen nicht 1 ergeben.

Auch hier kann man mit RoundToSum das Problem beheben.

Literatur

Diaconis, P., & Freedman, D. (2007, July 13). (Externer Link!) On Rounding Percentages.

Frederick Mosteller, Cleo Youtz, Douglas Zahn (Demography, 1969, 4, 850-858). The Distribution of Sums of Rounded Percentages.

Anwendungsbeispiel

Herber (Externer Link!) Eine Ganze Zahl auf 12 Monate prozentuell aufteilen

Appendix – Die Monte Carlo Programme

Bitte den Haftungsausschluss im Impressum beachten.

Option Explicit

Const n = 100
Const runs = 20000
Const bOnlyPositive = True 'Without loss of generality

Sub monte_carlo_add_rounded_values()
'Calculates for 2 to n how likely it is
'that rounding would not alter their sum.
'Example: for 2 numbers there is a 25% chance
'that the sum of their rounded values is not
'equal to their rounded sum.
'Source (EN): https://www.sulprobil.com/rounding_values_alters_their_sum_en/
'Source (DE): https://www.bplumhoff.de/werte_runden_aendert_ihre_summe_de/
'(C) (P) by Bernd Plumhoff 16-Dec-2023 PB V0.3
Dim i                 As Long
Dim j                 As Long
Dim k                 As Long
Dim m                 As Long
Dim d                 As Double
Dim s1                As Double
Dim s2                As Double

With Application.WorksheetFunction
Randomize
For i = 2 To n
    m = 0
    For j = 1 To runs
        s1 = 0#
        s2 = 0#
        For k = 1 To i
            If bOnlyPositive Then
                d = Rnd()
            Else
                d = 2# * Rnd() - 1#
            End If
            s1 = s1 + d
            s2 = s2 + .Round(d, 0)
        Next k
        s1 = .Round(s1, 0)
        If s1 <> s2 Then
            m = m + 1
        End If
    Next j
    Cells(i, 1) = i
    Cells(i, 2) = m / runs
Next i
End With
End Sub

Sub monte_carlo_percentage_sum_of_rounded_values()
'Calculates for 2 to n how likely it is that
'rounding would not alter their percentage sum.
'Example: for 2 numbers there is a 25% chance
'that the sum of their rounded values is not
'equal to their rounded sum.
'Source (EN): https://www.sulprobil.com/rounding_values_alters_their_sum_en/
'Source (DE): https://www.bplumhoff.de/werte_runden_aendert_ihre_summe_de/
'(C) (P) by Bernd Plumhoff 16-Dec-2023 PB V0.2
Dim i                 As Long
Dim j                 As Long
Dim k                 As Long
Dim m                 As Long
Dim s1                As Double
Dim s2                As Double

With Application.WorksheetFunction
Randomize
For i = 2 To n
    m = 0
    ReDim e(1 To i) As Double
    For j = 1 To runs
        s1 = 0#
        For k = 1 To i
            If bOnlyPositive Then
                e(k) = Rnd()
            Else
                e(k) = 2# * Rnd() - 1#
            End If
            s1 = s1 + e(k)
        Next k
        s2 = 0#
        For k = 1 To i
            e(k) = .Round(1000# * e(k) / s1, 0)
            s2 = s2 + e(k)
        Next k
        If s2 <> 1000# Then
            m = m + 1
        End If
    Next j
    Cells(i, 1) = i
    Cells(i, 2) = m / runs
Next i
End With
End Sub

Download

Bitte den Haftungsausschluss im Impressum beachten.

How_likely_does_rounding_values_alter_their_rounded_sum.xlsm [43 KB Excel Datei, ohne jegliche Gewährleistung]