/** * @Project: hehenian-biz-service * @Package com.hehenian.biz.common.settle * @Title: FPCISettleCalculator.java * @Description: TODO * @author: liuzgmf * @date 2015年1月7日 上午9:40:06 * @Copyright: HEHENIAN Co.,Ltd. All rights reserved. * @version V1.0 */ package com.hehenian.biz.common.settle; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.lang.time.DateUtils; import com.hehenian.biz.common.system.dataobject.SettDetailDo; import com.hehenian.biz.common.util.CalculateUtils; /** * 平息结算方式,Fixed principal interest is calculated( 固定本金计算利息) * * @author: liuzgmf * @date 2015年1月7日 上午9:40:06 */ public class FPICSettleCalculator extends SettleCalculator { public static void main(String[] args) { SettleCalculator eiSettleCalculator = new LPSettleCalculator(); List<SettDetailDo> settDetailDoList = eiSettleCalculator.calSettDetail(100000.0, 12, 22.5); for (SettDetailDo settDetailDo : settDetailDoList) { System.out.println(settDetailDo); } } @Override public List<SettDetailDo> calSettDetail(Double loanAmount, Integer loanPeriod, Double annualRate, Date startDate) { Double remainingPrincipal = loanAmount;// 剩余本金 List<SettDetailDo> settDetailDoList = new ArrayList<SettDetailDo>(); for (int i = 1; i <= loanPeriod.intValue(); i++) { Double principal = 0.00;// 月还本金 if (i >= loanPeriod.intValue()) { principal = remainingPrincipal; } else { principal = calMonthRepayPrincipal(loanAmount, loanPeriod); } // 每月借款费用 SettDetailDo settDetailDo = new SettDetailDo(); settDetailDo.setPeriod(i); settDetailDo.setPrincipal(principal); Double interest = calMonthRepayInterest(loanAmount, annualRate);// 月还利息 settDetailDo.setInterest(interest); settDetailDo.setRemainingPrincipal(remainingPrincipal); settDetailDo.setRepayDate(DateUtils.addMonths(startDate, i));// 还款日期 remainingPrincipal = CalculateUtils.sub(remainingPrincipal, principal); settDetailDoList.add(settDetailDo); } return settDetailDoList; } /** * 计算月还利息金额 * * @param remainingPrincipal * 剩余本金 * @param annualRate * 年利率 * @return * @author: liuzgmf * @date: 2014年9月24日上午9:33:45 */ private Double calMonthRepayInterest(Double remainingPrincipal, Double annualRate) { return CalculateUtils.round(CalculateUtils.mul(remainingPrincipal, getMonthRate(annualRate)), 2); } /** * 计算月还本金金额 * * @param loanAmount * @param loanPeriod * @return * @author: liuzgmf * @date: 2014年9月24日上午9:28:51 */ private Double calMonthRepayPrincipal(Double loanAmount, Integer loanPeriod) { return CalculateUtils.div(loanAmount, loanPeriod, 2); } }