我在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项,因为这两项在四舍五入的条目和原始条目之间的差异最大。在
第一步是计算期望结果与实际总和之间的误差:
这可以是积极的或消极的。由于
^{pr2}$myRoundedList
中的每个项都在实际值的0.005范围内,因此此错误将小于原始数组中每个项的0.01。您可以简单地除以0.01并四舍五入得到必须调整的项目数:现在剩下的就是选择需要调整的项目。最佳结果来自于首先调整那些最接近边界的值。您可以通过按原始值和舍入值之间的差异进行排序来找到这些值。在
如answer by kettlehell中所述,考虑PyPI包^{} 。不过,它内部不使用NumPy。在
首先,你不应该用浮点数来储存钱(用小数代替)。但下面我提供了一些非常通用的解决方案-您需要存储、累积和使用舍入中的差异之和。一些冗长的(不是很像Python的;-)示例:
相关问题 更多 >
编程相关推荐