我有 3 个值,它们都四舍五入到没有小数位(即 5%、25%、70%),除了我的 70% 实际上是 70.6%,所以它变成 71%,这使我的总数为 5%、25%、 71% = 101% 这不好,特别是因为我有一个条形图,如果它超过 100% 宽度,就会变得非常困惑。
如何确保我的 3 个值永远不会超过 100%? 现在我正在使用 Math.Round(value,0) 是否有任何开关/选项可以用来防止我的 3 个值的总和超过 100%?
谢谢
最佳答案
如果三个值总和必须为 100,则只对其中两个值进行四舍五入并计算第三个值
third = 100 - Math.Round(a) - Math.Round(b);
注意:您的结果也可能太小。如果您有三个值 33.333333,四舍五入并相加将得到 99!
编辑(回应@BlueRajaDannyPflughoeft 的评论)
如果您有很多值,所有舍入误差的总和可能会变大。因此,将其移至最后一个值并不是一个好主意。对于这些情况,我建议连续舍入。
double[] values = new double[] { 17.2, 3.7, 4.6, 5.8 };
int[] percent = new int[values.Length];
double sum = values.Sum();
int totalPercent = 100;
for (int i = 0; i < values.Length; i++) {
double rawPercent = sum == 0 ? 0 : values[i] / sum * totalPercent;
sum -= values[i];
int roundedPercent = (int)Math.Round(rawPercent);
totalPercent -= roundedPercent;
percent[i] = roundedPercent;
}
// values = { 17.2, 3.7, 4.6, 5.8 }
//
// Percents:
// percent => { 55, 12, 15, 18 }
// raw (exact) => { 54.952, 11.821, 14.696, 18.530 } (rounded to 3 decimals)
// raw continuous => { 54.952, 11.809, 14.596, 18.000 }
它并不完美,但误差不应超过 1%。这是另一个例子
values = { 10.0, 10.0, 10.0, 10.0, 10.0, 10.0 }
Percents:
rounded => { 17, 17, 16, 17, 16, 17 }
raw (exact) => { 16.667, 16.667, 16.667, 16.667, 16.667, 16.667 }
raw continuous => { 16.667, 16.600, 16.500, 16.667, 16.500 17.000 }
关于c# - 数学舍入问题总计 > 100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9218576/