假设我们有一个带整数的项目列表:
USA: 3 people
Australia: 2 people
Germany: 2 people
Run Code Online (Sandbox Code Playgroud)
如果我们计算每个值与整个列表中的总和的百分比,我们得到:
USA: 3/(3+2+2)*100 = 42.857...%
Australia: 2/(3+2+2)*100 = 28.571...%
Germany: 2/(3+2+2)*100 = 28.571...%
Run Code Online (Sandbox Code Playgroud)
如果我们围绕它,我们得到:
USA: 43%
Australia: 29%
Germany: 29%
Run Code Online (Sandbox Code Playgroud)
总和43 + 29 + 29 = 101不是100,并且对软件的用户来说看起来有点奇怪.你会如何解决这个问题?
saw*_*awa 29
您可以参考选举中使用的最大剩余方法:维基百科:最大剩余方法
在你的情况下,你有
USA: 42.857...
Australia: 28.571...
Germany: 28.571...
Run Code Online (Sandbox Code Playgroud)
如果你取整数部分,你得到
USA: 42
Australia: 28
Germany: 28
Run Code Online (Sandbox Code Playgroud)
最多可以增加98,你想再增加两个.现在,你看一下小数部分
USA: 0.857...
Australia: 0.571...
Germany: 0.571...
Run Code Online (Sandbox Code Playgroud)
并采取最大的,直到总数达到100.如果你采取美国,总数变为99,你想再拿一个.这里出现了问题.由于你在澳大利亚和德国之间留下了0.571的领带,如果你同时拿到两者,总数将是101.所以你有两种方法可供选择:
(a)如果你强烈要求总数为100,那就去澳大利亚,不要再采取任何措施:
USA: 43
Australia: 29
Germany: 28
Run Code Online (Sandbox Code Playgroud)
(b)如果你更愿意尊重澳大利亚和德国并列的事实,那你就停止了:
USA: 43
Australia: 28
Germany: 28
Run Code Online (Sandbox Code Playgroud)
Mat*_*att 12
如果你担心结果对用户来说有点奇怪,我会在结果上加上一个脚注,提到百分比已经四舍五入,而我的总数不是100%.只有在舍入导致此行为时,您才能以编程方式显示消息.
USA percentage: 43
Australia percentage: 29
Germany percentage: 29
Run Code Online (Sandbox Code Playgroud)
*Percentages may not total 100 due to rounding
由于您使用的是Ruby,我建议使用有理数.这样您就不会在需要时失去精度.您可以使用旁边的有理数字显示百分比,而不是脚注,如下所示:
USA percentage: 43 (3/7)
Australia percentage: 29 (2/7)
Germany percentage: 29 (2/7)
Run Code Online (Sandbox Code Playgroud)
包括更多小数位,以便舍入误差不那么严重:
USA percentage: 42.9
Australia percentage: 28.6
Germany percentage: 28.6
Run Code Online (Sandbox Code Playgroud)
这导致100.1而不是101.