我创建了一个计算贷款申请摊销时间表的方法。我使用Carbon为用户每次支付贷款增加一个月,下面是我的代码片段:
public function amoritization($amount,$interest_rate,$repaid_months,$start_date)
{
$beginning_balance = $amount;
$interest = $interest_rate/100/12;
$payback = $repaid_months;
$x = pow(1 + $interest,$payback);
$monthly_payment = ($beginning_balance*$x*$interest)/($x-1);
$payment_date = new Carbon($start_date)
$info = (object)[]; //convert empty array to an object
$amoritization = [];
$count = 0;
while($payback > 0){
$total_interest = $interest * $beginning_balance; //interest
$principal_payment = $monthly_payment - $total_interest; //principal
$ending_balance = $beginning_balance - $principal_payment; //ending balance
$info->beginning_balance = (float)$beginning_balance;
$info->total_interest = $total_interest;
$info->payment = $monthly_payment;
$info->principal_payment = $principal_payment;
$info->ending_balance = $ending_balance;
$info->payment_date = $payment_date->addMonths($count++);
array_push($amoritization,$info);
$beginning_balance = $ending_balance;
$info = (object)[];
$payback--;
}
return $amoritization;
}
这个方法在我的控制器中调用如下:
return $this->calculation->amoritization($data['amount'],$data['interest_rate'],$data['loan_term'],$data['start_date']);
这是一个问题,例如,$start_date变量存储了这个值2016-04-14 10:34:56,$return变量的值为6。在while循环语句中,$info对象添加了payment_date的属性,该属性存储添加的月份:
$info->payment_date = $payment_date->addMonths($count++);
当while循环语句循环一次时,我应该得到的值是2016-05-14。然而,这是我从回复中得到的:
payment_date :{date: "2016-10-14 10:34:56.247000", timezone_type: 2, timezone: "Z"}
此外,当我在循环中这样做时:
return $info->payment_date;
我找回了价值2016-05-14。这可能是什么原因造成的?提前感谢您的帮助,
只需执行:
$info->payment_date = $payment_date->addMonths(1); //or just $payment_date->addMonth();
比方说:$start_date = '2016-04-14'
;
您的问题是$count++
在第一次迭代中为1,并添加1个月。
$payment_date
现在是'2016-05-14'
在第二次迭代中,$count
现在等于2
,并添加2个月。
$payment_date
现在是'2016-07-14'
在第三次迭代中,$count
现在等于3
,并添加3个月。
$payment_date
现在是'2016-10-14'
当您在循环中执行return
时,它在第一次迭代后停止。
我也面临同样的问题。
显然有个bug。您不能将addMonths()用于月底的日期,如4月30日或5月31日。
我仍然不确定为什么,但如果你使用addMonths()和2月1日这样的日期,它会很好地正确相加。
基本上,在使用addMonths()之前,您必须将日期调整为较早的日期;
这个虫子让我疯了。