在Python的数值列表中,保持它们的总和。

2024-09-29 23:21:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中有一个十进制数的列表或数组。我需要四舍五入到小数点后两位,因为这些是货币金额。但是,我需要维护整个数组的和,即原始数组四舍五入到小数点后两位的和必须等于数组中四舍五入元素的和。在

以下是我目前为止的代码:

myOriginalList = [27226.94982, 193.0595233, 1764.3094, 12625.8607, 26714.67907, 18970.35388, 12725.41407, 23589.93271, 27948.40386, 23767.83261, 12449.81318]
originalTotal = round(sum(myOriginalList), 2)
# Answer = 187976.61

# Using numpy
myRoundedList = numpy.array(myOriginalList).round(2)
# New Array = [ 27226.95    193.06   1764.31  12625.86  26714.68  18970.35  12725.41 23589.93 27948.4   23767.83  12449.81]

newTotal = myRoundedList.sum()
# Answer = 187976.59

我需要一个有效的方法来修改我的新的四舍五入数组,使之和也是187976.61。2便士的差额需要适用于第7项和第6项,因为这两项在四舍五入的条目和原始条目之间的差异最大。在


Tags: 代码answernumpy元素列表货币条目数组
3条回答

第一步是计算期望结果与实际总和之间的误差:

>>> error = originalTotal - sum(myRoundedList)
>>> error
0.01999999996041879

这可以是积极的或消极的。由于myRoundedList中的每个项都在实际值的0.005范围内,因此此错误将小于原始数组中每个项的0.01。您可以简单地除以0.01并四舍五入得到必须调整的项目数:

^{pr2}$

现在剩下的就是选择需要调整的项目。最佳结果来自于首先调整那些最接近边界的值。您可以通过按原始值和舍入值之间的差异进行排序来找到这些值。在

>>> myNewList = myRoundedList[:]
>>> for _,i in sorted(((myOriginalList[i] - myRoundedList[i], i) for i in range(len(myOriginalList))), reverse=n>0)[:abs(n)]:
    myNewList[i] += math.copysign(0.01, n)

>>> myRoundedList
[27226.95, 193.06, 1764.31, 12625.86, 26714.68, 18970.35, 12725.41, 23589.93, 27948.4, 23767.83, 12449.81]
>>> myNewList
[27226.95, 193.06, 1764.31, 12625.86, 26714.68, 18970.359999999997, 12725.42, 23589.93, 27948.4, 23767.83, 12449.81]
>>> sum(myNewList)
187976.61

answer by kettlehell中所述,考虑PyPI包^{}。不过,它内部不使用NumPy。在

>>> from iteround import saferound
>>> saferound([1.0, 2.1, 3.6], places=0)
[1.0, 2.0, 4.0]

首先,你不应该用浮点数来储存钱(用小数代替)。但下面我提供了一些非常通用的解决方案-您需要存储、累积和使用舍入中的差异之和。一些冗长的(不是很像Python的;-)示例:

# define your accuracy
decimal_positions = 2

numbers = [27226.94982, 193.0595233, 1764.3094, 12625.8607, 26714.67907, 18970.35388, 12725.41407, 23589.93271, 27948.40386, 23767.83261, 12449.81318]
print round(sum(numbers),decimal_positions)
>>> 187976.61

new_numbers = list()
rest = 0.0
for n in numbers:
    new_n = round(n + rest,decimal_positions)
    rest += n - new_n
    new_numbers.append( new_n )

print sum(new_numbers)
>>> 187976.61

相关问题 更多 >

    热门问题