为了账号安全,请及时绑定邮箱和手机立即绑定

如何使四舍五入的百分比加起来等于100%

如何使四舍五入的百分比加起来等于100%

12345678_0001 2019-10-15 09:14:35
考虑以下四个百分比,以float数字表示:    13.626332%    47.989636%     9.596008%    28.788024%   -----------   100.000000%我需要将这些百分比表示为整数。如果仅使用Math.round(),我最终将占101%。14 + 48 + 10 + 29 = 101如果使用parseInt(),我最终将获得97%的收益。13 + 47 + 9 + 28 = 97有什么好的算法可以将任意数量的百分比表示为整数,而总数量仍保持100%?编辑:在阅读了一些评论和答案之后,显然有很多方法可以解决此问题。在我看来,为了忠于数字,“正确”的结果是使总误差最小化,该误差由相对于实际值引入的误差舍入多少来定义:        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)。
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超12个赞

由于这里的答案似乎都无法正确解决,因此这是我使用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]


查看完整回答
反对 回复 2019-10-15
?
守候你守候我

TA贡献1802条经验 获得超10个赞

只要您不担心依赖原始十进制数据,有许多方法可以做到这一点。


第一种,也许是最受欢迎的方法是最大剩余法


基本上是:


四舍五入

求和与100之差

通过以小数部分的降序向项目加1来分配差异

在您的情况下,它将如下所示:


13.626332%

47.989636%

 9.596008%

28.788024%

如果取整数部分,则得到


13

47

 9

28

总计为97,而您想再添加三个。现在,您看一下小数部分,它们是


.626332%

.989636%

.596008%

.788024%

并选择最大的,直到总数达到100。这样您将获得:


14

48

 9

29

另外,您可以选择显示小数点后一位而不是整数。因此,数字将是48.3和23.9等。这将使方差从100下降很多。


查看完整回答
反对 回复 2019-10-15
?
拉莫斯之舞

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。


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 3687 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信