我需要一个算法来舍入unrounded
列表中的所有数字,从而生成一个带有给定总和的rounded
列表。到目前为止,我的逻辑是迭代近似:
while rounded != unrounded:
if rounded > unrounded:
***find number closest to rounding down***
例如,请考虑这个未列入名单
[132.86, 57.78, 132.52, 137.36, 44.98, 97.05, 55.01, 26.64,
136.84, 75.08, 83.56, 21.28, 0.00, 0.00]
总和是1000.96;我需要一个总和为1000的整数列表。当我简单地将每个浮点数舍入到最接近的整数时,我有
[133.0, 58.0, 133.0, 137.0, 45.0, 97.0, 55.0, 27.0, 137.0, 75.0, 84.0, 21.0, 0.0, 0.0]
哪个总和为1002.在这个例子中,我需要找到一种方法,从未包围的列表向下舍入132.52和83.56以弥补差异。我必须改变这两个:数字四舍五入,它们有最小的小数部分。
答案 0 :(得分:3)
您只需映射圆函数:
myList = [132.86, 57.78, 132.52, 137.36, 44.98, 97.05, 55.01, 26.64, 136.84, 75.08, 83.56, 21.28, 0.00, 0.00]
print([*map(round, myList)])
=> [133, 58, 133, 137, 45, 97, 55, 27, 137, 75, 84, 21, 0, 0]
答案 1 :(得分:0)
我想我理解:你的列表有一个总和关闭到期望的结果(1000),但是你想要向上或向下舍入每个数字,这样总和就是1000。
此外,您要确定要向上舍入哪些数字以及向下舍入哪些数字,以便将具有较高小数部分的数字向上舍入。在上面的例子中,你做了一个简单的四舍五入,但想出了998的总和...所以你想要将接下来的两个最小的小数部分(.52和.56)弄圆,得到1000的总和。
为此,您需要更简单的步骤:
(1)通过在同一方向上舍入所有内容获得近似总和,因此您可以计算出每个方向上要舍入的项目数。您只需将int
映射到列表并获取结果的总和即可完成此操作:
lower_sum = sum(map(int(myList))
(2)现在,您需要将向上一定数量的元素,即round_up = 1000 - lower_sum
。
(3)根据每个数字的小数部分对列表进行排序。
fract_sort = sorted(myList, key = lambda x:x%1)
(4)现在,只需整理round_up
的最后fract_sort
个元素。
特定编码留给学生练习。 : - )
答案 2 :(得分:0)
让我们总结你现在拥有的东西:
import math
the_list = [132.86, 57.78, 132.52, 137.36, 44.98, 97.05, 55.01, 26.64, 136.84, 75.08, 83.56, 21.28, 0.00, 0.00]
the_list = [math.floor(x) for x in the_list]
print sum(the_list)
>>> 995.0
那里并不奇怪,但我们还没有解决它。所以,让我们这样做:
print sum([round(x) for x in the_list])
>>> 1002.0
好的,太低了。 值的一些应该向上舍入(a.k.a。,可能"正确") - 但不是所有。见
max_frac = sorted(the_list, key=lambda x: x - math.floor(x))
print max_frac
>>> [0.0, 0.0, 55.01, 97.05, 75.08, 21.28, 137.36, 132.52, 83.56, 26.64, 57.78, 136.84, 132.86, 44.98]
因此,只有一些值必须四舍五入,其他值向下舍入。我们如何选择要汇总的数字?从最高(分数)开始,当然:
1000 - sum([math.floor(x) for x in the_list])
>>> 5.0
......最高分是最后一分。我们甚至知道有多少数字需要四舍五入:
math.ceil
我们不会使用[1.33,1.33,1.34]
来增加这些数字,因为这对于简单的列表math.floor(x)+1
会失败;相反,我们使用import math
the_list = [132.86, 57.78, 132.52, 137.36, 44.98, 97.05, 55.01, 26.64, 136.84, 75.08, 83.56, 21.28, 0.00, 0.00]
the_list_a = [math.floor(x) for x in the_list]
diff = int(1000 - sum(the_list_a))
max_frac = sorted(the_list, key=lambda x: x - math.floor(x))[-diff:]
for m in max_frac:
the_list_a[the_list.index(m)] = math.floor(m)+1
print the_list_a
print sum(the_list_a)
>>> [133.0, 58.0, 132.0, 137.0, 45.0, 97.0, 55.0, 27.0, 137.0, 75.0, 83.0, 21.0, 0.0, 0.0]
>>> 1000.0
。这导致我们找到一个完整的解决方案
sed