gpt4 book ai didi

c# - 数学舍入问题总计 > 100%

转载 作者:太空狗 更新时间:2023-10-29 18:08:39 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com