擅长:python、mysql、java
<p>第一步是计算期望结果与实际总和之间的误差:</p>
<pre><code>>>> error = originalTotal - sum(myRoundedList)
>>> error
0.01999999996041879
</code></pre>
<p>这可以是积极的或消极的。由于<code>myRoundedList</code>中的每个项都在实际值的0.005范围内,因此此错误将小于原始数组中每个项的0.01。您可以简单地除以0.01并四舍五入得到必须调整的项目数:</p>
^{pr2}$
<p>现在剩下的就是选择需要调整的项目。最佳结果来自于首先调整那些最接近边界的值。您可以通过按原始值和舍入值之间的差异进行排序来找到这些值。在</p>
<pre><code>>>> 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
</code></pre>