今天有个公司的复利出现问题,要求重新计算复利。他们的收益方式是这样的,假如收益是 0.8%    

  1. 1、每周的周六日不计算收益,10月1,5月1这种不受干涉,只要是周一到周五就计算收益。
  2. 2、收益+本金进入下一天当本金计算。

也就是假如投资1000,三天的收益就是 1000+1000*(0.8/100)+(1000+1000*(0.8/100))*(0.8/100)

当时看了一下,他们的php是这样算的

  1. 1、将日期从开始时间开始来进入递归函数,每次增加一天,判断是否是周六或周日,一直计算到结束时间,计算总天数,但是他们有180天定期理财,那么多订单循环哎。
  2. 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 );

其实就这么简单就计算出来了,只是他们想的公式不对,造成了系统严重卡顿,因为这个着急所以也没优化算法,大家有好的算法,可以留言哦

点赞(33) 打赏

评论列表 共有 1 条评论

肖伟 5年前 回复TA

来自小程序评论

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部