There are many waysrounding methods that round an integer to the nearest integer (all, all of themwhich are basically the same except on the half-integers). The sum of integers obtainedreturned will be close to the sum of the original numbers on average when the distribution of the fraction parts of the numbers are roughly symmetric to $0.5$. One of those methods might be good enough for you in practice.
However, none of the abovethem will ensure the rule for sum, "the sum of output integers must be as close to the sum of original numbers as possible". To achieve thatFor example, the nearest integer to $0.6$ and $0.7$ is $1$ but the nearest integer to their sum $0.6+0.7=1.3$ is $1$ instead of $1+1 =2$. Hence to satisfy the rule of sum, we needcannot guarantee that each integer is mapped to keep trackits nearest integer.
Let us pick one of the gap/error betweenrounding methods as $\mathcal R$, which will specify the two sumsexact meaning of "as close as possible". For methods below, we will ensure that $$\mathcal R(\text{sum of input numbers})=\text{sum of output integers}$$ while trying to round integers to their respective nearest integers fairly.
Offline Method
Suppose a list of numbers $a_1, a_2, \cdots, a_n$ are given. Let
Let $\{a_i\}=a_i-\lfloor a_i\rfloor$ be the fractional part of $a_i$.
Let $s = \{a_1\} + \{a_i\} + \cdots + \{a_n\}$. Let $\mathcal R$ be one of the "round half and ..." methods above$s = \{a_1\} + \{a_2\} + \cdots + \{a_n\}$. Then
- roundRound down $a_i$ to $\lfloor a_i\rfloor$ for $i\le n-\mathcal R(s)$,
- roundRound up $a_i$ to $\lfloor a_i\rfloor + 1$ for $i\gt n-\mathcal R(s)$otherwise.
To be fair, sort $a_i$ by $\{a_i\}$ before rounding so that, for example, $4.8$ will be roundrounded up instead of $7.6$ if one of them should be roundrounded up.
Online Method
Input: a source that produces numbers
Output: numbers rounded to integers
Procedure:
- Let number $gap$ be $0$
- Pick one of the "round half ..." methods as $\mathcal R$.
- For each number $num$ in the source:
- Let $num{\_}rounded=\mathcal R(gap + num)$. Output $num{\_}rounded$.
- Add $num - num{\_}rounded$ to $gap$.
MixedBuffered Method
We can mix the offline method and the online method by repeating the following procedure after initializing number $gap=0$.
- Apply the offline method to the next block of numbers, including $gap$ as a summand for $s$ as well.
- Add the difference between the sum of the numbers obtainedreturned in step 1 and the sum of the original numbers to $gap$.
The size of each block of numbers is up to your choice.