3 回答

TA貢獻1786條經驗 獲得超13個贊
由于這里的答案似乎都無法正確解決,因此這是我使用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]

TA貢獻1802條經驗 獲得超10個贊
只要您不擔心依賴原始十進制數據,有許多方法可以做到這一點。
第一種,也許是最受歡迎的方法是最大剩余法
基本上是:
四舍五入
求和與100之差
通過以小數部分的降序向項目加1來分配差異
在您的情況下,它將如下所示:
13.626332%
47.989636%
9.596008%
28.788024%
如果取整數部分,則得到
13
47
9
28
總計為97,而您想再添加三個?,F在,您看一下小數部分,它們是
.626332%
.989636%
.596008%
.788024%
并選擇最大的,直到總數達到100。這樣您將獲得:
14
48
9
29
另外,您可以選擇顯示小數點后一位而不是整數。因此,數字將是48.3和23.9等。這將使方差從100下降很多。

TA貢獻1820條經驗 獲得超10個贊
做到這一點的“最佳”方法可能是保持您所在位置的連續(非整體)統計并舍入該值,然后將其與歷史記錄一起使用以確定應該使用什么值。例如,使用您提供的值:
Value CumulValue CumulRounded PrevBaseline Need
--------- ---------- ------------ ------------ ----
0
13.626332 13.626332 14 0 14 ( 14 - 0)
47.989636 61.615968 62 14 48 ( 62 - 14)
9.596008 71.211976 71 62 9 ( 71 - 62)
28.788024 100.000000 100 71 29 (100 - 71)
---
100
在每個階段,您都不會對數字本身進行四舍五入。取而代之的是,您對累計值進行四舍五入,并計算出從上一個基線達到該值的最佳整數-該基線是前一行的累積值(四舍五入)。
之所以可行,是因為您不會在每個階段都丟失信息,而是更智能地使用信息。“正確”的四舍五入值在最后一列中,您可以看到它們的總和為100。
添加回答
舉報