四舍五入相加的百分比

时间:2019-08-13 14:05:11

标签: javascript algorithm math

我遇到了提出百分比表的问题:

+---+---+---+
| A | B | C |
+---+---+---+
| D | E | F |
+---+---+---+
| G | H | I |
+---+---+---+

ABDE是我可以全分辨率使用的输入。下列关系也应在显示的表中直观显示:

A + B + C + D = 100
C = A + B
F = D + E
G = A + D
B = E + H
C + F = 100
G + H = 100
I = 100

现在,我不想显示完整的分辨率值,实际上,我想在所有表单元格中显示0到100范围内的“整数”百分比。我担心的是,如果我仅根据A,B,C和D计算C,F,G,H和I,然后对表进行四舍五入(例如使用toFixed(0)),那么很可能由于边界条件和四舍五入的统一处理,显示的值不会“累加”(即总是将0.5向上舍入)。

是否有一种简单的,算法化的,规范的方式来获得我想要的结果,而无需解决将(A,B,C和D视为“已知”且将C,F,G视为(过度约束)联立方程组)的问题,并且H被视为“未知”?对我来说,它看起来也像是线性规划约束满足问题。在我看来,我可能也想得太多了。我意识到没有一个唯一的解决方案来解决这个问题,我只是在寻找一种方法来提出“合理的”答案。你觉得呢?

作为我担心的问题的快速演示,可以说A = 24.5,B = 25.5,D = 25.5和E = 24.5。 24.5 + 25.5 + 25.5 + 24.5 =100。使用toFixed(0)进行四舍五入得到A = 25,B = 26,D = 26和E =25。A+ B + D + E = 102,G = H = C = F =51。失败。

1 个答案:

答案 0 :(得分:1)

这是四舍五入问题的一种情况。对于这种情况,让我们从一个明确的案例开始:

[24.2, 25.7, 25.5, 24.6]        sum = 100

将每个数字环绕;列出第二个差异列表original - rounded

[24, 26, 26, 25]    sum = 101
[0.2, -0.3, -0.5, -0.4]

我们有一个多余的1。我们想要使用此更改后的值来更改最不正确的元素:这是舍入-0.5时负变化最大的元素。这给了我们

[24, 26, 25, 25]    sum = 100
[0.2, -0.3, +0.5, -0.4]

由于总和现在为100,因此我们完成了更改。如果您有一个更大的示例,但过多或不足,请对差异进行迭代,直到完成为止。例如,在您遇到的问题中:

[25, 26, 26, 25]     sum = 102
[-0.5, -0.5, -0.5, -0.5]

我们将减少两个条目。由于这四个值相等,因此此算法不在乎我们选择哪两个。我用更多的单独值来完成此操作,并通过应用百分比更改来做出选择:这种情况会将26个值都减少到25个。