如何将数字分成多个部分,使得结果总和等于输入?

Nar*_*esh 9 c#

我试图将一个数字分成多个部分,因此该部分的总和等于输入数字.

如果我有3.99并且如果我需要分成两部分,则预期输出为2和1.99(2 + 1.99 = 3.99)

如果我需要将3.99分成3个部分,预期输出为1.3,1.3和1.39(1.3 + 1.3 + 1.39 = 3.99)

我能够输出2.99和1作为第一个例子,我能够得到1.99,1和1作为第二个例子.但是,在这两种情况下,结果与预期产出相差甚远.

我需要将邮寄费用分成不同的订单项.结果可以等分或不等分,同时确保不同部分的总和等于输入数.

以下是其他一些例子:

3.99 divided in 3 parts: 1.33, 1.33, 1.33
3.98 divided in 3 parts: 1.33, 1.33, 1.32
3.97 divided in 3 parts: 1.32, 1.32, 1.33
3.96 divided in 3 parts: 1.32, 1.32, 1.32
3.95 divided in 3 parts: 1.32, 1.32, 1.31
Run Code Online (Sandbox Code Playgroud)

Jon*_*n B 6

我测试了你提供的值.可能需要一些调整:

static IEnumerable<decimal> SplitValue2(decimal value, int count)
{
    if (count <= 0) throw new ArgumentException("count must be greater than zero.", "count");
    var result = new decimal[count];

    decimal runningTotal = 0M;
    for (int i = 0; i < count; i++)
    {
        var remainder = value - runningTotal;
        var share = remainder > 0M ? Math.Max(Math.Round(remainder / ((decimal)(count - i)), 2), .01M) : 0M;
        result[i] = share;
        runningTotal += share;
    }

    if (runningTotal < value) result[count - 1] += value - runningTotal;

    return result;
}
Run Code Online (Sandbox Code Playgroud)

这假设您传入一个2位小数精度的值.如果你传入3.999,你将无法获得正确的结果.