圆形浮动,同时保持总和相等

时间:2017-06-24 15:15:01

标签: python

我有一个加起来整数的浮点数列表。由于间接原因,我必须使用for循环迭代x次,x是列表中的每个浮点数,但由于range()函数的参数必须是整数,因此每个浮点数必须舍入。但是,我希望循环的总数保持等于原始浮点数的总和,这通常不等于舍入数字的总和。你会如何解决这个问题? 谢谢。

2 个答案:

答案 0 :(得分:3)

我最近不得不解决一个类似的问题,并决定对我的各个项目来说,通用化一个Python解决方案并将其打包就足够普遍了。检出iteround

答案 1 :(得分:1)

好的,这有点数学:

你有一系列实数Xi 他们的总和等于N. sum(Xi)= N

让我们将每个实数分解为其整数和残余实数(在0和1之间):Xi = Ri + fi

现在,你需要一系列与Xi相近的整数Yi,但它们是整数,也是N的总和。我们可以这样打破它们:Yi = Ri + Fi(其中Fi是0或1的整数)。

现在我们需要: sum(Yi)= sum(Xi)= N

如果你打破了这个,你会得到这个等式作为解决方案的要求: sum(Fi)= sum(fi)= N - sum(Ri)

让我们表示:K = N - sum(Ri)

现在解决方案很简单,选择具有最大fi值的K个元素,并将其对应的Fi分配给1;将另一个Fi指定为0。

现在您有Yi的值,在您的情况下是循环大小

以下是代码:

def round_series_retain_integer_sum(xs):
    N = sum(xs)
    Rs = [round(x) for x in xs]
    K = N - sum(Rs)
    assert K == round(K)
    fs = [x - round(x) for x in xs]
    indices = [i for order, (e, i) in enumerate(reversed(sorted((e,i) for i,e in enumerate(fs)))) if order < K]
    ys = [R + 1 if i in indices else R for i,R in enumerate(Rs)]
    return ys


xs = [5.2, 3.4, 2.1, 7.3, 3.25, 6.25, 8.2, 9.1, 10.1, 55.1]
ys = round_series_retain_integer_sum(xs)

print xs, sum(xs)
print ys, sum(ys)

我认为我没有任何错误,我希望你能得到这个想法,即便如此