如何使四舍五入的百分比加起来为 100% [英] How to make rounded percentages add up to 100%
问题描述
考虑以下四个百分比,用float
数字表示:
Consider the four percentages below, represented as float
numbers:
13.626332%
47.989636%
9.596008%
28.788024%
-----------
100.000000%
我需要将这些百分比表示为整数.如果我简单地使用 Math.round()
,我最终会得到 101%.
I need to represent these percentages as whole numbers. If I simply use Math.round()
, I end up with a total of 101%.
14 + 48 + 10 + 29 = 101
如果我使用 parseInt()
,我最终得到了 97%.
If I use parseInt()
, I end up with a total of 97%.
13 + 47 + 9 + 28 = 97
将任意数量的百分比表示为整数同时仍保持总数为 100% 的好算法是什么?
What's a good algorithm to represent any number of percentages as whole numbers while still maintaining a total of 100%?
编辑:在阅读了一些评论和答案后,显然有很多方法可以解决这个问题.
Edit: After reading some of the comments and answers, there are clearly many ways to go about solving this.
在我看来,为了保持真实的数字,正确"的结果是最小化整体误差的结果,定义为相对于实际值会引入多少误差:
In my mind, to remain true to the numbers, the "right" result is the one that minimizes the overall error, defined by how much error rounding would introduce relative to the actual value:
value rounded error decision
----------------------------------------------------
13.626332 14 2.7% round up (14)
47.989636 48 0.0% round up (48)
9.596008 10 4.0% don't round up (9)
28.788024 29 2.7% round up (29)
在平局 (3.33, 3.33, 3.33) 的情况下,可以做出任意决定(例如 3, 4, 3).
In case of a tie (3.33, 3.33, 3.33) an arbitrary decision can be made (e.g. 3, 4, 3).
推荐答案
由于这里的答案似乎都无法正确解决,这里是我使用 underscorejs:
Since none of the answers here seem to solve it properly, here's my semi-obfuscated version using underscorejs:
function foo(l, target) {
var off = target - _.reduce(l, function(acc, x) { return acc + Math.round(x) }, 0);
return _.chain(l).
sortBy(function(x) { return Math.round(x) - x }).
map(function(x, i) { return Math.round(x) + (off > i) - (i >= (l.length + off)) }).
value();
}
foo([13.626332, 47.989636, 9.596008, 28.788024], 100) // => [48, 29, 14, 9]
foo([16.666, 16.666, 16.666, 16.666, 16.666, 16.666], 100) // => [17, 17, 17, 17, 16, 16]
foo([33.333, 33.333, 33.333], 100) // => [34, 33, 33]
foo([33.3, 33.3, 33.3, 0.1], 100) // => [34, 33, 33, 0]
这篇关于如何使四舍五入的百分比加起来为 100%的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!