数学舍入问题总数> 100%

tap*_*tap 8 c# math rounding

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

  • 我还是一开始就没有四舍五入.你仍然遇到33.33333问题,但无论你使用什么方法,这都是不可避免的,除非你强迫它们加起来达到100%. (2认同)

Dou*_*rch 5

不要添加舍入值并期望得到任何有意义的东西.添加未包含的值.如果这不符合你的要求,你必须通过添加舍入值来解释你认为你正在完成的事情.


Ole*_*ksi 1

你不能像这样在最后做一个检查吗:

if (total > 100)
  total = 100;
Run Code Online (Sandbox Code Playgroud)

  • 或者使用“Math.Min(total, 100)”。 (4认同)
  • 那么,他需要减少这 3 个值中的哪一个呢?增加了多少? (3认同)