Самый первый вопрос, который я хотел бы вам задать, это:
- Знаете ли вы количество значений заранее?
Если нет, тогда у вас нет другого выбора, кроме как суммировать, считать и делить, чтобы получить среднее значение. Если Double
недостаточно высокая точность, чтобы справиться с этим, то вам не повезло, вы не можете использовать Double
, вам нужно найти тип данных, который может обработать это.
Если, с другой стороны, вы знаете заранее знаете количество значений, вы можете посмотреть, что вы действительно делаете, и изменить как вы это делаете, но продолжаете общий результат.
Среднее значение N, хранящееся в некоторой коллекции A, таково:
A[0] A[1] A[2] A[3] A[N-1] A[N]
---- + ---- + ---- + ---- + .... + ------ + ----
N N N N N N
Чтобы вычислить подмножества этого результата, вы можете разделить вычисления на равные по размеру наборы, что можно сделать для трехзначных наборов (при условии, что число значений делится на 3, в противном случае вам нужен другой делитель)
/ A[0] A[1] A[2] \ / A[3] A[4] A[5] \ // A[N-1] A[N] \
| ---- + ---- + ---- | | ---- + ---- + ---- | \\ + ------ + ---- |
\ 3 3 3 / \ 3 3 3 / // 3 3 /
--------------------- + -------------------- + \\ --------------
N N N
--- --- ---
3 3 3
Обратите внимание, что вам нужно наборов одинакового размера , в противном случае числа в последнем наборе, которым не хватит значений по сравнению со всеми наборами до него, будут иметь большее влияние на конечный результат.
Рассмотрим числа 1-7 по порядку. Если вы выберете размер набора 3, вы получите такой результат:
/ 1 2 3 \ / 4 5 6 \ / 7 \
| - + - + - | + | - + - + - | + | - |
\ 3 3 3 / \ 3 3 3 / \ 3 /
----------- ----------- ---
y y y
, что дает:
2 5 7/3
- + - + ---
y y y
Если у равен 3 для всех наборов, вы получите это:
2 5 7/3
- + - + ---
3 3 3
, что дает:
2*3 5*3 7
--- + --- + ---
9 9 9
, что:
6 15 7
- + -- + -
9 9 9
, что составляет:
28
-- ~ 3,1111111111111111111111.........1111111.........
9
Среднее 1-7, это 4. Очевидно, это не сработает. Обратите внимание, что если вы выполните вышеупомянутое упражнение с числами 1, 2, 3, 4, 5, 6, 7, 0, 0 (обратите внимание на два нуля в конце), то вы получите вышеуказанный результат.
Другими словами, если вы не можете разделить количество значений на наборы одинакового размера, последний набор будет засчитан так, как если бы он имел такое же количество значений, как и все наборы, предшествующие ему, но он будет дополнен с нулями для всех пропущенных значений.
Итак, вам нужны наборы одинакового размера . Не повезло, если ваш исходный входной набор состоит из простого числа значений.
Здесь меня беспокоит потеря точности. Я не совсем уверен, что Double
даст вам достаточно хорошую точность в таком случае, если он изначально не может содержать всю сумму значений.