Помощь в составлении функции округления в массиве

хотелось бы узнать возможный способ округления элементов массива, сумма элементов которого в конечном счете будет равна длине массива.

def minimass():
    i,f,g=0,0,sum(rel)
    while i<len(rel):
        rel[i]=round(rel[i]/(g/len(rel)))
        i+=1
    print(rel)
    return rel


rel=[40,21,16.5,22.5]
print(len(rel))
minimass()

В ответе данного примера получается [2, 1, 1, 1] и сумма всех элементов не равна длине, я же хочу получить сумму равную длинне
Правильное решение [1,1,1,1] должно получиться по следующей схеме

40-25=15 
21-25=-4 
16.5-25=-8.5 
22.5-25=-2.5

25/2=12.5

15-12.5=2.5 [1] Требуется округлить по условию! Это значение точно округлится 100%
-4+12.5=8.5 [1]
-8.5+12.5=4 [1]
-2.5+12.5=10 [1] это значение не округлится 100%

Ответы (2 шт):

Автор решения: Stanislav Volodarskiy

По мере округления ошибка переносится на следующие элементы. В итоге это приведёт к тому что сумма округлённого массива будет равна сумме исходного.

Подгонка суммы массива вынесена в отдельную функцию:

def norm_arr(a):
    s = sum(rel)
    return [len(rel) * v / s for v in rel]


def round_arr(a):
    b = []
    error = 0
    for v in a:
        r = round(v + error)
        b.append(r)
        error = v - r
    return b


rel = [40, 21, 16.5, 22.5]
print(round_arr(norm_arr(rel)))
$ python round_arr.py
[2, 0, 2, 0]

P.S. Это традиционный способ снижения битности изображений - пикселы округляются, а сумма (яркость картинки) остаётся примерно такой же. В вашем случае задачу можно ставить по разному, этот способ может подойти.

→ Ссылка
Автор решения: Marvin

Пришел к выводу, что это скорее всего правильная реализация:

def minimass():
    i,f,g,boc,ab,gb,res_gb=0,0,sum(rel),[],0,[],[]
    while i<len(rel):
        rel[i]=(rel[i]/(g/len(rel)))
        i+=1
    i=0
    while i<len(rel):
        boc.append(round(rel[i]))
        i+=1
    if sum(rel)!=sum(boc):
        if sum(rel)<sum(boc):
            ab=sum(boc)-sum(rel)
            i=0
            while i<len(rel):
                gb.append(rel[i]%1)
                i+=1
            res_gb=sorted(gb)
            print(gb)
            print(res_gb)
            i=0
            while i<ab:
                boc[gb.index(res_gb[i])]=boc[gb.index(res_gb[i])]-1
                i+=1
            print(boc)
        else:
            ab=sum(rel)-sum(boc)
            i=0
            while i<len(rel):
                gb.append(rel[i]%1)
                i+=1
            res_gb=sorted(gb)
            print(gb)
            print(res_gb)
            i=0
            while i<ab:
                boc[gb.index(res_gb[i])]=boc[gb.index(res_gb[i])]+1
                i+=1
            print(boc)
→ Ссылка