今天有个公司的复利出现问题,要求重新计算复利。他们的收益方式是这样的,假如收益是
0.8%
- 1、每周的周六日不计算收益,10月1,5月1这种不受干涉,只要是周一到周五就计算收益。
- 2、收益+本金进入下一天当本金计算。
也就是假如投资
1000
,三天的收益就是 1000+1000*(0.8/100)+(1000+1000*(0.8/100))*(0.8/100)
当时看了一下,他们的php是这样算的
- 1、将日期从开始时间开始来进入递归函数,每次增加一天,判断是否是周六或周日,一直计算到结束时间,计算总天数,但是他们有180天定期理财,那么多订单循环哎。
- 2、金额计算也是递归,上一个递归出总天数后,这个计算按照上边的公式继续递归计算,看了之后真的脑瓜疼。还出错,看了之后改成如下代码:
// 计算两个日期之间的工作日
function get_weekend_days($start_date,$end_date,$is_workday = false){
if (strtotime($start_date) > strtotime($end_date)) list($start_date, $end_date) = array($end_date, $start_date);
$start_reduce = $end_add = 0;
$start_N = date('N',strtotime($start_date));
$start_reduce = ($start_N == 7) ? 1 : 0;
$end_N = date('N',strtotime($end_date));
in_array($end_N,array(6,7)) && $end_add = ($end_N == 7) ? 2 : 1;
$alldays = abs(strtotime($end_date) - strtotime($start_date))/86400 + 1;
$weekend_days = floor(($alldays + $start_N - 1 - $end_N) / 7) * 2 - $start_reduce + $end_add;
if ($is_workday){
$workday_days = $alldays - $weekend_days;
return $workday_days;
}
return $weekend_days;
}
// 日期之间的工作日
$day = get_weekend_days('2018-08-20','2018-10-20',true);
// 计算收益,假如是`1000`
// 复利计算的特点是:把上期末的本利和作为下一期的本金,在计算时每一期本金的数额是不同的。复利的计算公式是:F= P*(1+i)^n
$interest = 1000 * pow( (1+0.8/100) ,$day );
其实就这么简单就计算出来了,只是他们想的公式不对,造成了系统严重卡顿,因为这个着急所以也没优化算法,大家有好的算法,可以留言哦
来自小程序评论