均匀地将美元金额(十进制)除以整数

时间:2010-01-11 01:19:09

标签: c# division accounting

我需要为我正在构建的程序编写一个会计例程,它将给出一个十进制的偶数除以整数。例如:

$143.13 / 5 =

28.62
28.62
28.63
28.63
28.63

我在这里看过这篇文章:Evenly divide in c#,但它似乎只适用于整数除法。想知道这个问题的优雅解决方案吗?

8 个答案:

答案 0 :(得分:33)

一次计算一个金额,并从总金额中减去每个金额,以确保始终保留正确的总金额:

decimal total = 143.13m;
int divider = 5;
while (divider > 0) {
  decimal amount = Math.Round(total / divider, 2);
  Console.WriteLine(amount);
  total -= amount;
  divider--;
}

结果:

28,63
28,62
28,63
28,62
28,63

答案 1 :(得分:29)

你可以在不构建数组的情况下解决这个问题:

int a = 100 * amount;
int low_value = a / n;
int high_value = low_value + 1;
int num_highs = a % n;
int num_lows = n - num_highs;

答案 2 :(得分:3)

处理美分更容易。我建议用14313除以14313而不是14313。它给你2862和剩下的3.你可以将这个余数分配给前三个部分或任何你喜欢的方式。最后,将美分兑换成美元。

另请注意,您将始终获得的剩余部分少于您想要的部件数量。

答案 3 :(得分:3)

首先,请确保您不使用浮点数来表示美元和美分(请参阅其他帖子了解原因,但简单的原因是并非所有十进制数都可以表示为浮点数,例如,$ 1.79)

这是一种方法:

decimal total = 143.13m;
int numberOfEntries = 5;
decimal unadjustedEntryAmount = total / numberOfEntries;
decimal leftoverAmount = total - (unadjustedEntryAmount * numberOfEntries);
int numberOfPenniesToDistribute = leftoverAmount * 100;
int numberOfUnadjustedEntries = numberOfEntries - numberOfPenniesToDistribute;

所以现在你有未调整的金额28.62,然后你必须决定如何分配余数。你可以从顶部或底部开始分配额外的便士(看起来你想从底部开始)。

for (int i = 0; i < numberOfUnadjustedEntries; i++) {
  Console.WriteLine(unadjustedEntryAmount);
}

for (int i = 0; i < numberOfPenniesToDistribute; i++) {
  Console.WriteLine(unadjustedEntryAmount + 0.01m);
}

您还可以将整个余数添加到第一个或最后一个条目中。最后,根据会计需求,您还可以为剩余部分创建单独的事务。

答案 4 :(得分:2)

如果你有一个精确保证两位精度的浮点数,那么这个(伪代码):

amount = amount * 100 (convert to cents)
int[] amounts = new int[divisor]
for (i = 0; i < divisor; i++) amounts[i] = amount / divisor
extra = amount % divisor
for (i = 0; i < extra; i++) amounts[i]++

然后用amounts做任何你想做的事情,你可以转换回花车,如果你绝对必须,或格式化为美元和美分。

如果不清楚的话,所有这一切的重点不仅仅是均匀划分浮动值,而是尽可能均匀地划分货币金额,因为美分是不可分割的美元单位。 OP:请告诉我这是不是你想要的。

答案 5 :(得分:1)

你可以在你引用的问题中使用算法乘以100,使用整数均匀除法函数,然后将每个结果除以100(假设你只想处理2 dp,如果你想要3dp倍数1000等)

答案 6 :(得分:1)

看看这个问题:What is the best data type to use for money in c#?

等一下!你想确保没有一分钱丢失,对吗?

答案 7 :(得分:1)

也可以使用C#迭代器生成来使Guffa's answer更方便:

public static IEnumerable<decimal> Divide(decimal amount, int numBuckets)
{
    while(numBuckets > 0)
    {
        // determine the next amount to return...
        var partialAmount = Math.Round(amount / numBuckets, 2);
        yield return partialAmount;
        // reduce th remaining amount and #buckets
        // to account for previously yielded values
        amount -= partialAmount;
        numBuckets--;
    }
}