如何将金额分成最接近的 100 个部分

  • 本文关键字:个部 最接近 金额 c#
  • 更新时间 :
  • 英文 :


我使用以下代码将金额分成几部分

public static IEnumerable<int> DistributeInteger(double total, int divider)
{
    if (divider == 0)
    {
        yield return 0;
    }
    else
    {
        double rest = total % divider;
        double result = total / (double)divider;
        for (int i = 0; i < divider; i++)
        {
            if (rest-- > 0)
                yield return (int)Math.Ceiling(result);
            else
                yield return (int)Math.Floor(result);
        }
    }
}

并按如下方式使用它

var test = DistributeInteger(5000, 4).ToList();

上面的代码返回我。

1250
1250
1250
1250

(所有四部分之和 = 5000(

但是我需要它作为每个部分的最接近的 100 个,例如

1300
1300
1300
1100

如果我通过

var test = DistributeInteger(5219, 5).ToList();

然后它正在返回

1044
1044
1044
1044
1043

(所有五个部分的总和 = 5219(但它应该是

1000
1000
1000
1000
1000
219

如果金额 1 到 100,例如 89,那么它将返回相同的金额,即 89,

我从早上开始尝试,但没有运气。以及我从网络中检查的 5 月代码,但它只给出了获得给定编号的最接近 100 值的解决方案。

这个怎么样?

public static IEnumerable<int> DistributeInteger(double total, int divider)
{
    int part = 100 * ((int)(50 + total / divider) / 100);
    if (part == 0)
    {
        yield return (int)total;
        yield break;
    }
    double runningTotal = 0;
    while (runningTotal <= (total - part))
    {
        yield return part;
        runningTotal += part;
    }
    if (runningTotal < total)
        yield return (int) (total - runningTotal);
}

(注意:为简洁起见,省略了错误处理。

怎么样:

public static IEnumerable<int> DistributeInteger(double total, int divider)
{
    // get increment to the nearest hundred
    var increment = (int) Math.Round(total/ 100 / divider, MidpointRounding.AwayFromZero) * 100;
    // make sure increment is non-zero
    if (increment == 0) increment = 100;
    var remainder = (int) total;
    // subtract increment while remainder is >= zero
    while (remainder >= increment){
        remainder -= increment;
        yield return increment;
    }
    // check if remainder is non-zero
    if (remainder > 0)
        yield return remainder;
}

现在使用天花板

似乎适用于中点从零四舍五入

这种方法怎么样:

public static IEnumerable<int> DistributeInteger(double total, int divider)
{
  if (divider == 0)
  {
    return null;
  }
  else
  {
    var parts = new List<int>();
    var singlePart = total / divider;
    singlePart = Math.Round(singlePart / 100, MidpointRounding.AwayFromZero) * 100;
    while (total - singlePart > 0)
    {
      parts.Add((int)singlePart);
      total -= singlePart;
    }
    // Add remainnig value.
    parts.Add((int)total);
    return parts;
  }
}

它仅适用于第二种情况,对于第一种情况,您需要使用Ceiling函数而不是Round

最新更新