我有3个值,全部四舍五入到无小数位(即5%,25%,70%),除了我的70%真的是70.6%所以它达到71%,这使得我的总数为5%,25%,71%= 101%这是不好的,特别是因为我有一个条形图,如果它超过100%宽度,真的搞砸了.
我怎样才能确保我的3个值永远不会超过100%?现在我使用Math.Round(值,0)是否有任何开关/选项可以用来保持我的3个值的总和超过100%?
谢谢
Oli*_*bes 11
如果这三个值总是必须总和为100,那么只对两个值进行舍入,并计算第三个值
third = 100 - Math.Round(a) - Math.Round(b);
Run Code Online (Sandbox Code Playgroud)
注意:您的结果也可能太小.如果您有三个值为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 }
Run Code Online (Sandbox Code Playgroud)
它并不完美,但误差不应超过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 }
Run Code Online (Sandbox Code Playgroud)
你不能像这样在最后做一个检查吗:
if (total > 100)
total = 100;
Run Code Online (Sandbox Code Playgroud)