如何找到最接近圆形的数字?

时间:2018-01-30 12:36:01

标签: python python-2.7

我需要一个算法来舍入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以弥补差异。我必须改变这两个:数字四舍五入,它们有最小的小数部分。

3 个答案:

答案 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