我有以下代码将金额除以一个数字,并将结果分配为每月需要支付的金额。
objData.month_per_amount = (Convert.ToDecimal(txtAmount.Value) / Convert.ToInt32(txtMonths.Value));
在一个场景示例中,如果我将13除以3并将结果四舍五入到2位小数,则每个月得到4.33。但是当我乘以4.33乘以3时,我得到12.99,这不等于13.存在0.01的差异。在这种情况下,我如何分配如下:
第1个月:4.33 第2个月:4.33 第3个月:4.34希望我明确表示,首选代码只有在存在这种差异时才能执行,例如,如果将14除以2,我们每月得7,而7 + 7 = 14,所以同样的数字我们来到这里。
答案 0 :(得分:3)
在会计中,你经常使用一种叫做“减少平衡”的东西。为了这。我们的想法是计算月份总数,从总体总数中扣除,减少月数。如下所示:
decimal balance = 13m;
int months = 3;
int monthsRemaining = 3;
for (var i = 0; i < months; i++)
{
decimal thisMonth = Math.Round(balance / monthsRemaining, 2);
balance -= thisMonth;
monthsRemaining -= 1;
Console.WriteLine("Month {0}: {1}", i + 1, thisMonth);
}
这将产生4.33,4.34,4.33。
这种方法的好处是,舍入误差在整个期间内分布相当均匀,而不是一个月内全部均匀分布。例如,使用该方法的超过24个月的100个将导致23个支付4.17和1个4.09,而减少余额将是每月4.16或4.17。
答案 1 :(得分:1)
您不必检查剩余部分。更高效的C#代码(就所需的计算而言)如下所示。
echo $z
答案 2 :(得分:1)
如果存在差异,您无需将其作为特殊情况,您只需将上个月的付款计算为剩余的金额即可达到总金额。如果没有差异,那么无论如何它将是相同的值。例如:
int months = Convert.ToInt32(txtMonths.Value);
decimal amount = Convert.ToDecimal(txtAmount.Value);
month_per_amount = Decimal.Round(amount / months, 2);
decimal last_month = amount - (months - 1) * month_per_amount;
for (int month = 1; month <= months; month++) {
decimal monthly = month < months ? month_per_amount : last_month;
Console.WriteLine("Month {0}: {1}", month, monthly);
}
答案 3 :(得分:0)
如果“金额%月== 0”,则不会出现差异。否则,最后一项应该比其他项目多一点。 (这里的代码可能有一些语法问题,我想向您展示算法。)
decimal amount = Convert.ToDecimal(txtAmount.Value);
int month = Convert.ToInt32(txtMonths.Value);
int n = 3;
decimal amounts[3];//n = 3
for (int i = 0 ; i < n-1 ; i++)
amounts[i] = amount / month;
if ( amount % month != 0 ) {
amounts[n-1] = amount - ( amount / month * (n-1) ) ;
else
amounts[n-1] = amount / month ;