我需要为我正在构建的程序编写一个会计例程,它将给出一个十进制的偶数除以整数。例如:
$143.13 / 5 =
28.62
28.62
28.63
28.63
28.63
我在这里看过这篇文章:Evenly divide in c#,但它似乎只适用于整数除法。想知道这个问题的优雅解决方案吗?
答案 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--;
}
}