3 回答

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個(gè)贊
由于這里的答案似乎都無(wú)法正確解決,因此這是我使用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貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
只要您不擔(dān)心依賴(lài)原始十進(jìn)制數(shù)據(jù),有許多方法可以做到這一點(diǎn)。
第一種,也許是最受歡迎的方法是最大剩余法
基本上是:
四舍五入
求和與100之差
通過(guò)以小數(shù)部分的降序向項(xiàng)目加1來(lái)分配差異
在您的情況下,它將如下所示:
13.626332%
47.989636%
9.596008%
28.788024%
如果取整數(shù)部分,則得到
13
47
9
28
總計(jì)為97,而您想再添加三個(gè)?,F(xiàn)在,您看一下小數(shù)部分,它們是
.626332%
.989636%
.596008%
.788024%
并選擇最大的,直到總數(shù)達(dá)到100。這樣您將獲得:
14
48
9
29
另外,您可以選擇顯示小數(shù)點(diǎn)后一位而不是整數(shù)。因此,數(shù)字將是48.3和23.9等。這將使方差從100下降很多。

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
做到這一點(diǎn)的“最佳”方法可能是保持您所在位置的連續(xù)(非整體)統(tǒng)計(jì)并舍入該值,然后將其與歷史記錄一起使用以確定應(yīng)該使用什么值。例如,使用您提供的值:
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
在每個(gè)階段,您都不會(huì)對(duì)數(shù)字本身進(jìn)行四舍五入。取而代之的是,您對(duì)累計(jì)值進(jìn)行四舍五入,并計(jì)算出從上一個(gè)基線(xiàn)達(dá)到該值的最佳整數(shù)-該基線(xiàn)是前一行的累積值(四舍五入)。
之所以可行,是因?yàn)槟粫?huì)在每個(gè)階段都丟失信息,而是更智能地使用信息?!罢_”的四舍五入值在最后一列中,您可以看到它們的總和為100。
添加回答
舉報(bào)