- package com.fr.stable.fun;
- import java.math.BigDecimal;
- import com.fr.general.FArray;
- import com.fr.script.AbstractFunction;
- import com.fr.stable.Primitive;
- public class NPV extends AbstractFunction {
- private static final long serialVersionUID = -6688689751867351315L;
- @Override
- public Object run(Object[] params) {
- if(null == params || params.length<2 || params.length>3){
- return Primitive.ERROR_VALUE;
- }
- switch(params.length){
- case 2:
- if(!(params[0] instanceof FArray)){
- return Primitive.ERROR_VALUE;
- }
- double ic = ((BigDecimal)params[1]).doubleValue();
- return npv(trans((FArray)params[0]),ic);
- case 3:
- if(!(params[0] instanceof FArray) || !(params[1] instanceof FArray)){
- return Primitive.ERROR_VALUE;
- }
- ic = ((BigDecimal)params[2]).doubleValue();
- return npv(trans((FArray)params[0]),trans((FArray)params[1]),ic);
- default:
- return Primitive.ERROR_VALUE;
- }
- }
-
- private FArray<BigDecimal> trans(FArray in){
- FArray<BigDecimal> rt = new FArray<BigDecimal>();
- for(int i=0;i<in.length();i++){
- Object ele = in.elementAt(i);
- if(ele instanceof String){
- String val = (String) ele;
- rt.add(new BigDecimal(val));
- }else if(ele instanceof Integer){
- Integer val = (Integer) ele ;
- rt.add(new BigDecimal(val));
- }else if(ele instanceof Float){
- Float val = (Float) ele;
- rt.add(new BigDecimal(val));
- }else if(ele instanceof Double){
- Double val = (Double) ele;
- rt.add(new BigDecimal(val));
- }else if(ele instanceof Long){
- Long val = (Long) ele;
- rt.add(new BigDecimal(val));
- }else{
- rt.add((BigDecimal) ele);
- }
- }
- return rt;
- }
-
- private Object npv(FArray<BigDecimal> cio,double ic){
- if(null == cio){
- return Primitive.ERROR_VALUE;
- }
- int t = cio.length();
- double sum = 0.0;
- double crtic = 1;
- for(int i=0;i<t;i++){
- crtic *= (1+ic);
- sum += cio.elementAt(i).doubleValue()/crtic;
- }
- return sum;
- }
-
- private Object npv(FArray<BigDecimal> ci,FArray<BigDecimal> co,double ic){
- if(ci ==null || co == null){
- return Primitive.ERROR_VALUE;
- }
- if(ci.length() != co.length()){
- return Primitive.ERROR_VALUE;
- }
-
- FArray<BigDecimal> cio = new FArray<BigDecimal>();
- for(int i=0;i<ci.length();i++){
- cio.add(ci.elementAt(i).subtract(co.elementAt(i)));
- }
- return npv(cio,ic);
- }
- }
复制代码
我简单粗暴上代码~
|