Javascript 带舍入的百分比加法闭包

Javascript 带舍入的百分比加法闭包,javascript,algorithm,math,Javascript,Algorithm,Math,我有一个提交百分比表的问题: +---+---+---+ | A | B | C | +---+---+---+ | D | E | F | +---+---+---+ | G | H | I | +---+---+---+ A、B、D和E是我可以完全解析的输入。以下关系也应在显示的表格中直观地保持: 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 现在,我

我有一个提交百分比表的问题:

+---+---+---+
| A | B | C |
+---+---+---+
| D | E | F |
+---+---+---+
| G | H | I |
+---+---+---+
A
B
D
E
是我可以完全解析的输入。以下关系也应在显示的表格中直观地保持:

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。失败。

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

[24.2, 25.7, 25.5, 24.6]        sum = 100
将每个图形四舍五入;再次列出差异
原始-四舍五入

[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个。

我发现了一个类似的问题