在列表中添加一个数字,使其变为 20%

Add a number in list so it becomes 20 percent

我想在一个数字列表中添加一个数字,以便在将该数字添加到该列表后,它占整个列表的 20%。

目标是在 itextsharp PDF 中创建 table 时设置第一列的绝对宽度 (20%) 和其他列的相对宽度。

例如这里有一个列表 {10,30,20,20}。我应该在其中添加什么,它也是列表总和的 20%,即 20 ( 20+10+30+20+20 = 100, 20/100 -> 20%)。

一些基础数学,例如 0.20 = x / (Sum + x) 可以得到 x = Sum/4。所以 Enumerable.Sum 会给你大部分结果:

listOfInt.Add (listOfInt.Sum()/4);

所以我的理解是您希望第 1 列的宽度是所有列宽度的 20%。您需要将所有列相加:

TOTAL_WIDTH = COL1 + COL2 + COL3 + ...
COL1 = 0.2 * TOTAL_WIDTH

COL1 = 0.2 (COL1 + COL2 + COL3 + ...)
COL1 - 0.2 * COL1 = 0.2 * (COL2 + COL3 + ...)
0.8 * COL1 = 0.2 * (COL2 + COL3 + ...)
COL1 = 0.25 * (COL2 + COL3 + ...)

这是你需要做的:

N4 = TOTAL * 0.2   
N1 + N2 + N3 + TOTAL * 0.2 = TOTAL
N1 + N2 + N3 = TOTAL * 0.8
(N1 + N2 + N3) / 0.8 = TOTAL

所以...

N4 = ((N1 + N2 + N3) / 0.8) * 0.2
N4 = (N1 + N2 + N3) / 4

所以让这个数字成为其他数字总和的 25% 就完成了。

你问题的第一部分很奇怪:你说的是一个列表,就好像你希望第一个项目占整个列表的 20%。您应该添加一张图来帮助我们理解这意味着什么。

你问题的第二部分是关于table。这很简单。如果你查看官方文档,你会找到问题的答案 How to change width of single column of table?

您可以使用setWidths()方法设置相对宽度。在您的情况下,您将拥有:

int columns = 8;
float[] widths = new float[columns];
float[0] = 20f;
for (int i = 1; i < columns; i++)
    float[i] = 80 / (columns - 1);
PdfPTable table = new PdfPTable(columns);
table.setWidths(widths);

如果您需要多于或少于 8 列,请将 8 更改为您想要的任何数字。

更新:

同时,你已经澄清了你的问题。

假设您有一个名为 widths1float[],它包含 table 的宽度。请注意,您将需要 float 而不是 int,因为我们要进行除法。

在这种情况下,您可以这样做:

int n = widths1.length;
float total = 0;
for (int i = 0; i < n; i++)
    total += widths1[i];
n++;
float[] widths2 = new float[n];
widths2[0] = total / 4;
for (int i = 1; i < n; i++)
    widths2[i] = widths1[i - 1];
PdfPTable table = new PdfPTable(n);
table.setWidths(widths2);