2011-10-19 43 views
0

我想在Java中实现PMT函数(来自Excel)。的PMT函数的公式为:Java中的Excel PMT函数

(D7*D9/12)/(1-(1+D9/12)^(-(D11/12)*12)) 

其中:

  • D7 =金融金额
  • D9 =率
  • D11 =期限

例如

D7 = $1,00,000, 
D9 = 10%, 
D11 = 36 

这里的PMT功能,即每月支付的输出将是$3,226.72

请任何人都帮我来计算这个函数在Java中的值。

+1

而你的问题是什么? '^'运算符?在Java中,剩下的基本数学就是没有区别。 – BalusC

回答

1

假设双类型的所有变量:

result=(d7*d9/12)/Math.pow((1-(1+D9/12),(-(d11/12)*12))) 
+0

它不工作。我给出的例子并不匹配。 – Debarati

+2

我已经解决了。你的实现并不完全正确,但它可以帮助我做到这一点。谢谢。 – Debarati

+0

可以粘贴为你工作的答案,谢谢 – Mike

8

您可以使用Apache POI:

http://poi.apache.org/apidocs/org/apache/poi/ss/formula/functions/FinanceLib.html

它节省了我的一天:d

用例:

FinanceLib.pmt(0.00740260861, 180, -984698, 0, false) 

参数:ratemonthspresent valuefuture valueat the beginning of the period(或结尾)

+0

你是如何在Android中使用它的?我的意思是你是如何在Android中用gradle导入的? –

+0

想通了。 '从这里下载jar''http://www.java2s.com/Code/Jar/p/ Downloadpoi39jar.htm'并将其包含在'libs'中。 –

0
//D7:Finance Amount 
//D9 = Rate(the rate here is annual rate) 
//D11 = Term 

fv=D7 * Math.pow((1 + D9/12), D11); 

PMT=(fv * D9/12)/(pow((1 + D9/12), D11) - 1); 
+0

D11,期限是几个月? –

+0

@ShubhamA。是的,3年,术语是3 * 12 = 36 – Ding

0

这是Excel PMT等效于JAVA:

public BigDecimal calcEMI(BigDecimal P, BigDecimal N, BigDecimal ROI) { 
     if(BigDecimalUtil.anyOneZeroOrNull(P,N,ROI)){ 
     SCBSUtils.throwSmartCBSException("Invalid data for calculating EMI %s, %s %s", P,N,ROI); 
     } 
     MathContext mc = MathContext.DECIMAL128; 
     //Excel equivalent formula == P*R*POWER(1+R,N)/(POWER(1+R,N)-1) 
     BigDecimal R = ROI.divide(new BigDecimal(1200),mc); 
     BigDecimal nemi1 = P.multiply(R,mc); 
     BigDecimal npower1 = (BigDecimal.ONE.add(R)).pow(N.intValue(),mc); 
     BigDecimal dpower1 = (BigDecimal.ONE.add(R)).pow(N.intValue(),mc); 
     BigDecimal denominator = dpower1.subtract(BigDecimal.ONE); 
     BigDecimal numerator = nemi1.multiply(npower1); 
     BigDecimal emi = numerator.divide(denominator,0,RoundingMode.UP); 
     return emi; 
    } 
+0

EXCEL PMT等同于JAVA –

0

像这样:

public static void main(String[] args) { 
    MathContext MATH_CONTEXT = new MathContext(18, RoundingMode.HALF_UP); 
    BigDecimal pmt = pmt(new BigDecimal("-100000", MATH_CONTEXT), 
      new BigDecimal("10", MATH_CONTEXT), 
      new BigInteger("36")); 
} 

public static BigDecimal pmt(BigDecimal D7, BigDecimal D9, BigInteger D11) { 
    BigDecimal rate = D9 
      .divide(new BigDecimal("100"), MATH_CONTEXT) 
      .divide(new BigDecimal("12"), MATH_CONTEXT); 
    return rate.negate(MATH_CONTEXT) 
      .multiply(D7.multiply(pow(BigDecimal.ONE.add(rate), D11), MATH_CONTEXT)) 
      .divide(pow(BigDecimal.ONE.add(rate), D11).subtract(BigDecimal.ONE), MATH_CONTEXT); 
} 

private static BigDecimal pow(BigDecimal x, BigInteger n) { 
    return x.pow(n.intValue(), MATH_CONTEXT); 
} 
0

Excel PMT函数使用比例方法计算年金。现在很多人都使用Conformal方法,而年金比较低。

在JAVA PMT实现:发布至今真正其他的答案

private static double calculateAnnuity(double creditAmmount, double interestRate, double numberOfYears, int calculationPeriod) { 
    double annuitiesPerYear = 12.0/(numberOfYears * 12.0) * (numberOfYears * 12.0)/calculationPeriod; 
    double period = 1/annuitiesPerYear; 

    double interest = Math.pow(1 + (interestRate/100), period) - 1; 
    double decursiveFactor = 1 + interest; 
    double annuityCalc = (Math.pow(decursiveFactor, numberOfYears * 12) * (decursiveFactor - 1))/(Math.pow(decursiveFactor, numberOfYears * 12) - 1); 
    return Math.round((creditAmmount * annuityCalc) * 100.0)/100.0; 
} 

// Test - credit ammount: 10000, interest rate 8.0 %, tenor: 60 months, . 
public static void main(String [] args){ 
    System.out.println(calculateAnnuity(10000, 8.0, 60/12.0, 1)); 
} 
0

似乎都不匹配Excel的结果。

这个工作对我来说:

if (D9 < 1E-6) { 
    return (D7/D11); 
} 
return (D7*D9)/(1.0 - Math.pow(1 + D9, -D11));