克服分裂中的差异

时间:2015-10-11 07:40:59

标签: c#

我有以下代码将金额除以一个数字,并将结果分配为每月需要支付的金额。

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,所以同样的数字我们来到这里。

4 个答案:

答案 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 ;