我有一个加起来整数的浮点数列表。由于间接原因,我必须使用for
循环迭代x次,x是列表中的每个浮点数,但由于range()
函数的参数必须是整数,因此每个浮点数必须舍入。但是,我希望循环的总数保持等于原始浮点数的总和,这通常不等于舍入数字的总和。你会如何解决这个问题?
谢谢。
答案 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)
我认为我没有任何错误,我希望你能得到这个想法,即便如此