();
for (CashDetailsBean obj : cdbList) {
new_cdbList.add(obj);
}
-
-
- //TODO:sea 期末购买权在月付情况下:最后一期日期加一月作为单独的一行数据,其它情况下:最后一期的日期
+
+
+ //TODO:sea 期末购买权在月付情况下:最后一期日期加一月作为单独的一行数据,其它情况下:最后一期的日期
//2014-06-11 期末余值新的处理逻辑:【符合】‘期末购买权月付/双月付情况’这个前提下, 期初情况的‘期末余值’与‘期末购买权’一致放在新增的一期一起作为最后一期现金流的数据
if(null != nominal_price && !"".equals(nominal_price) && Double.parseDouble(nominal_price) > Double.parseDouble("0.00") && !Tools.isNullOrEmpty(planDate) && ( "income_1".equals(income_number_year) || "12".equals(income_number_year) || "income_2".equals(income_number_year) || "6".equals(income_number_year) ) && ("period_type_1".equals(periodType) || "1".equals(periodType)) ){//月付/双月付情况下
//重新取一次值
CashDetailsBean new_cdb = new CashDetailsBean();//cdbList.get(cdbList.size() - 1);
planDate = planDate+"-01";//构建成完整的日期格式
- //2014-01-01 日期加1个月
+ //2014-01-01 日期加1个月
planDate = DateTools.getDateAdd(planDate, 1, "mm");
new_cdb.setPlanDate(planDate.substring(0, 7)+"-01");
new_cdb.setFundOut("0");
new_cdb.setFundOutDetails("");
-
+
new_cdb.setFundIn(String.valueOf(Double.parseDouble(nominal_price) + Double.parseDouble(equip_end_value)));
new_cdb.setFundInDetails("期末购买权:" + NumTools.formatNumberDouble(Double.parseDouble(NumTools.formatNumberDoubleScale(nominal_price, 2))) + ";期末余值:" + NumTools.formatNumberDouble(Double.parseDouble(NumTools.formatNumberDoubleScale(equip_end_value, 2))));
new_cdb.setNetFlow( String.valueOf( Double.parseDouble(nominal_price) + Double.parseDouble(equip_end_value) ) );
-
+
new_cdb.setOnhire_id( onhire_id + 1 );//现金流按固定格式补0情况下,所以这里月付情况下,直接最后一次变量加1做为最终的期末购买权排序依据
new_cdbList.add(new_cdb);
}else{
-
+
//TODO:2014-06-11 期末余值新的处理逻辑:【不符合】‘期末购买权月付情况’这个前提下, 期初情况的‘期末余值’与‘期末购买权’一致放在新增的一期一起作为最后一期现金流的数据
//TODO:这里存在少处理不是月付情况,例如:季付情况下,‘期末余值’是不是不能直接最后一期加一个月,是加一个租赁间隔,是加一个季度三个月,中间需要补两个0
if( !Tools.isNullOrEmpty(planDate) && null != equip_end_value && !"".equals(equip_end_value) && Double.parseDouble(equip_end_value) > Double.parseDouble("0.00") && ("period_type_1".equals(periodType) || "1".equals(periodType)) ){// 期初
//重新取一次值
CashDetailsBean new_cdb = new CashDetailsBean();//cdbList.get(cdbList.size() - 1);
planDate = planDate+"-01";//构建成完整的日期格式
- //2014-01-01 日期加1个月
+ //2014-01-01 日期加1个月
planDate = DateTools.getDateAdd(planDate, 1, "mm");
new_cdb.setPlanDate(planDate.substring(0, 7)+"-01");
new_cdb.setFundOut("0");
@@ -541,13 +541,13 @@ public class IrrTools {
new_cdb.setOnhire_id( onhire_id + 1 );//现金流按固定格式补0情况下,所以这里月付情况下,直接最后一次变量加1做为最终的期末购买权排序依据
new_cdbList.add(new_cdb);
}
-
+
}
-
+
return new_cdbList;
}
-
+
/**
* 对最后一项现金流明细进行整理,针对项目类型为‘VP业务’情况下,期末购买权不计算入最后一期现金流中。
* @author sea
@@ -562,31 +562,31 @@ public class IrrTools {
// 更新流入,净流量值
if (null != equip_end_value && !"".equals(equip_end_value) && Double.parseDouble(equip_end_value) > 0) {// 期末残值大于0时
cdb.setFundIn(String.valueOf(Double.parseDouble(cdb.getFundIn()) + Double.parseDouble(equip_end_value)));
-
+
cdb.setFundInDetails(cdb.getFundInDetails() + ";期末余值:" + NumTools.formatNumberDouble(Double.parseDouble(NumTools.formatNumberDoubleScale(equip_end_value, 2))));
-
+
cdb.setNetFlow(String.valueOf(Double.parseDouble(cdb.getNetFlow()) + Double.parseDouble(equip_end_value)));
}
-
+
if (null != nominal_price && !"".equals(nominal_price) && Double.parseDouble(nominal_price) > 0) {// 期末购买权【原名称:名义货价】大于0时
cdb.setFundIn(String.valueOf(Double.parseDouble(cdb.getFundIn()) + Double.parseDouble(nominal_price)));
//项目类型为‘VP业务’情况下,期末购买权不算入流入中
cdb.setFundInDetails( cdb.getFundInDetails() );
cdb.setNetFlow( cdb.getNetFlow() );
}
-
+
// 重新设置此元素的值
cdbList.set(cdbList.size() - 1, cdb);
-
+
// 2011-10-26
// 处理特殊的保证金抵扣 保证金抵扣金额小于保证金金额 最后要做一笔流出 为保证金金额减去保证金抵扣金额
cdbList = IrrTools.getRentDetailsByDeductOut(cdbList, cb.getCautionMoney(), cb.getCautionDeductionMoney());
-
+
return cdbList;
-
+
}
/**
- *
+ *
* ( 现金流明细构建)
* 按月计算IRR
* @param cdbList
@@ -595,7 +595,7 @@ public class IrrTools {
public static String getIrr(List cdbList) {
// 得到租金列表
List rent_list = getRentListByCashDetails(cdbList);
- /*
+ /*
* 后三个参数为固定按月计算
* @param chjg 固定值1
* @param zjjg 固定值1
@@ -606,7 +606,7 @@ public class IrrTools {
}
/**
- *
+ *
* @Title: getIrr
* @author zhangc
* @Description: 牛顿分切法计算XIRR
@@ -624,7 +624,7 @@ public class IrrTools {
return IrrTools.getXIRR(rent_list, planDate_list).toString();
//return IrrTools.getIRR(rent_list, "1","1","12");
}
-
+
public static String getIrrNew( List netList,List dateList,String process) throws Exception {
// 得到租金列表
//List rent_list = getRentListByCashDetails(cashlist,process);
@@ -634,9 +634,9 @@ public class IrrTools {
//return IrrTools.getIRR(rent_list, "1","1","12");
}
/**
- *
+ *
* ( 现金流明细构建)
- *
+ *
* @param cdbList
* @param cb
* @return
@@ -651,9 +651,9 @@ public class IrrTools {
}
/**
- *
+ *
* ( 现金流明细构建)
- *
+ *
* @param cdbList
* @param cb
* @return
@@ -668,9 +668,9 @@ public class IrrTools {
}
/**
- *
+ *
* ( 根据现金流明细得到新的租金列表,用于算irr值)
- *
+ *
* @param cdbList
*/
private static List getRentListByCashDetails(List cdbList) {
@@ -680,7 +680,7 @@ public class IrrTools {
}
return rent_list;
}
-
+
private static List getRentListByCashDetails(List cdbList,String process) throws Exception {
List rent_list = new ArrayList();
for (Object cdb : cdbList) {
@@ -691,12 +691,12 @@ public class IrrTools {
}else{
rent_list.add(((ContractCashDetailTemp)cdb).getNetFlow().toString());
}*/
-
+
rent_list.add(((BizObject)cdb).getAttribute("NET_FLOW").getString());
}
return rent_list;
}
-
+
private static List getRentListByCashDetailsPlanDate(List cdbList,String process) throws Exception {
List rent_list = new ArrayList();
for (Object cdb : cdbList) {
@@ -706,9 +706,9 @@ public class IrrTools {
}
/**
- *
+ *
* ( 算出均息法下的均息法租金列表的irr,并把其当做年利率传递做第二次正常租金测算)
- *
+ *
* @param cb
* 交易结构bean
* @param frpb
@@ -734,7 +734,7 @@ public class IrrTools {
} else {
l_inflow_pour.add("-" + leasing_money);
}
-
+
for (int i = grace; i < rent_list.size(); i++) {
l_inflow_pour.add(rent_list.get(i).toString());
}
@@ -745,16 +745,16 @@ public class IrrTools {
l_inflow_pour.set(l_inflow_pour.size()-1, new BigDecimal(l_inflow_pour.get(l_inflow_pour.size()-1)).add(new BigDecimal(cb.getEquipEndValue())).toString());
}
}
-
+
irr = IrrTools.getIRR(l_inflow_pour, String.valueOf(12 / Integer.parseInt(cb.getIncomeNumberYear())), String.valueOf(12 / Integer.parseInt(cb.getIncomeNumberYear())), cb.getIncomeNumberYear());
irr = Double.parseDouble(irr) + "";
return irr;
}
/**
- *
+ *
* (根据现金流获得对应的年利率)
- *
+ *
* @param alCash
* 现金流 用HashMap key为net_flow 存的每期的值
* @param income_number_year
@@ -770,7 +770,7 @@ public class IrrTools {
}
return NumTools.formatNumberDoubleScale(Double.parseDouble(getIRR(alirr, "1", "1", income_number_year)) * 100 + "", 6);
}
-
+
/**
* 根据原始现金流集合按固定模式补0构建成独特格式的现金流。
* @author sea
@@ -784,26 +784,26 @@ public class IrrTools {
List list = new ArrayList();
List cashList = new ArrayList();
// 期初(期末)支付 注意: 期初 数字 1 字符串 period_type_1 #分割线# 期末 数字0 字符串 period_type_0
- String periodType = cb.getPeriodType();
+ String periodType = cb.getPeriodType();
if (ccfbList != null && ccfbList.size() > 0 && ccfbList.size() > size) {//现金流的长度如果小于2条,该方法不适用,特别是期初情况下,理论上现金流只存在一行数据了
-
+
//第0期现金流集合
CashDetailsBean objFirst = new CashDetailsBean();
objFirst = ccfbList.get(0);//默认第0期的值等于原始现金流的第0期
-
- double firstIn = 0.00;
- double firstOut = 0.00;
+
+ double firstIn = 0.00;
+ double firstOut = 0.00;
String firstFundInDetails = "";
String firstFundOutDetails = "";
for (int i = 0; i < size; i++) {
CashDetailsBean oneObj = ccfbList.get(i);
//第i期流入流出
- firstIn = firstIn + NumberUtils.parseDouble( NumberUtils.nullToZero( oneObj.getFundIn() ) );
- firstOut = firstOut + NumberUtils.parseDouble( NumberUtils.nullToZero( oneObj.getFundOut() ) );
+ firstIn = firstIn + NumberUtils.parseDouble( NumberUtils.nullToZero( oneObj.getFundIn() ) );
+ firstOut = firstOut + NumberUtils.parseDouble( NumberUtils.nullToZero( oneObj.getFundOut() ) );
firstFundInDetails = firstFundInDetails +oneObj.getFundInDetails();
firstFundOutDetails = firstFundOutDetails+oneObj.getFundOutDetails();
}
-
+
//期初前收情况下:做合并处理
if("1".equals(periodType) || "period_type_1".equals(periodType)){
//封装新的第0期
@@ -816,7 +816,7 @@ public class IrrTools {
objFirst.setNetFlow(NumberUtils.doubleToString( firstIn + firstRent - firstOut ) );
objFirst.setOnhire_id(1000);
cashList.add(objFirst);
-
+
//封装后续所有现金流
int key = 2;
int onhire_id = 1000;
@@ -868,7 +868,7 @@ public class IrrTools {
}
return cashList;
}
-
+
/**
* 计算固定格式情况现金流补0个数。
* @author sea
@@ -894,7 +894,7 @@ public class IrrTools {
}
return num;
}
-
+
/**
* 生成补0的现金流对象。
* @author sea
@@ -915,14 +915,14 @@ public class IrrTools {
newObj.setOnhire_id(onhire_id);
return newObj;
}
-
-
+
+
/**
* 牛顿迭代法求IRR
* @param cashList:现金流List
* @return IRR
*/
- public BigDecimal getIRR(List cashList){
+ public static BigDecimal getIRR(List cashList){
//long startTime = System.currentTimeMillis();
BigDecimal diff = BigDecimal.ONE; //租金现值总和与总本金的差值
BigDecimal irr = BigDecimal.ZERO;
@@ -970,7 +970,7 @@ public class IrrTools {
BigDecimal daoRate=BigDecimal.ZERO; // 1/(1+irr)
BigDecimal netflowNow; //净流量现值
BigDecimal error = new BigDecimal("0.0000000001"); //误差
- int size = cashList.size(); //现金流大小
+ int size = cashList.size(); //现金流大小
int j = 0; //迭代次数
double k = 0;
String startDate = "";
@@ -990,7 +990,7 @@ public class IrrTools {
}catch(Exception e){
e.printStackTrace();
}
-
+
}
j++;
irr = irr.subtract(diff.divide(derivative, 20, BigDecimal.ROUND_HALF_UP)); //迭代关系式