首页 > 解决方案 > 如何将数量转换为最接近 100 的部分

问题描述

我正在使用下面的代码将金额分成几部分

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,

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

标签: c#

解决方案


这个怎么样?

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);
}

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


推荐阅读