Java中的excelpmt函数

Java中的excelpmt函数,java,Java,我想用Java实现PMT函数(来自Excel)。PMT函数的公式为: (D7*D9/12)/(1-(1+D9/12)^(-(D11/12)*12)) 其中: D7=融资金额 D9=速率 D11=术语 比如说 D7 = $1,00,000, D9 = 10%, D11 = 36 此处,PMT功能(即每月付款)的输出将为3226.72美元 请任何人帮助我用Java计算此函数值。假设所有变量均为双精度类型: result=(d7*d9/12)/Math.pow((1-(1+D9/12),(-(

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

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

  • D7=融资金额
  • D9=速率
  • D11=术语
比如说

D7 = $1,00,000,
D9 = 10%,
D11 = 36
此处,PMT功能(即每月付款)的输出将为3226.72美元


请任何人帮助我用Java计算此函数值。

假设所有变量均为双精度类型:

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

假设所有变量均为双精度类型:

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

您可以使用Apache POI:

它拯救了我的一天:D

用法示例:

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

参数:
比率
月份
现值
未来值
在期初
(或期末)

您可以使用Apache POI:

它拯救了我的一天:D

用法示例:

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

参数:
费率
月份
现值
未来值
期初
(或期末)

这是JAVA中的Excel PMT等价物:

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;
    }

这是JAVA中的Excel PMT等价物:

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;
    }
大概是这样的:

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);
}
大概是这样的:

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);
}

Excel PMT函数使用比例法计算年金。现在很多人使用保形法,年金稍微低一点

PMT在JAVA中的实现:

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));
}

Excel PMT函数使用比例法计算年金。现在很多人使用保形法,年金稍微低一点

PMT在JAVA中的实现:

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));
}

目前发布的其他答案似乎都与Excel的结果不符

这对我很有用:

if (D9 < 1E-6) {
    return (D7 / D11);
}
return (D7*D9) / (1.0 - Math.pow(1 + D9, -D11));
if(D9<1E-6){
返回(D7/D11);
}
返回(D7*D9)/(1.0-数学功率(1+D9,-D11));

目前发布的其他答案似乎都与Excel的结果不符

这对我很有用:

if (D9 < 1E-6) {
    return (D7 / D11);
}
return (D7*D9) / (1.0 - Math.pow(1 + D9, -D11));
if(D9<1E-6){
返回(D7/D11);
}
返回(D7*D9)/(1.0-数学功率(1+D9,-D11));

这是我的尝试,主要是试图保持它与Excel具有相同的参数。我从ApachePOI的代码中去掉了它,并将其切换为使用
BigDecimal
s

/**
 * PMT function ported from Excel to Java to use BigDecimals.
 * @param interestRate                   interest rate for the loan.
 * @param numberOfPayments               is the total number of payments for the loan.
 * @param principal                      is the present value; also known as the principal.
 * @param futureValue                    It is the future value, or the balance that you want to have left after the last payment. If fv is omitted, the fv is assumed to be zero.
 * @param paymentsDueAtBeginningOfPeriod payments are due at the beginning of the period.
 * @return payment
 * @see <a href="https://apache.googlesource.com/poi/+/4d81d34d5d566cb22f21999e653a5829cc678ed5/src/java/org/apache/poi/ss/formula/functions/FinanceLib.java#143">FincanceLib</a>
 */
public static BigDecimal pmt(BigDecimal interestRate,
                       int numberOfPayments,
                       BigDecimal principal,
                       BigDecimal futureValue,
                       boolean paymentsDueAtBeginningOfPeriod) {

    final BigDecimal n = new BigDecimal(numberOfPayments);
    if (BigDecimal.ZERO.equals(interestRate)) {
        return (futureValue.add(principal)).divide(n, MathContext.DECIMAL128).negate();
    } else {
        final BigDecimal r1 = interestRate.add(BigDecimal.ONE);
        final BigDecimal pow = r1.pow(numberOfPayments);

        final BigDecimal divisor;
        if (paymentsDueAtBeginningOfPeriod) {
            divisor = r1.multiply(BigDecimal.ONE.subtract(pow));
        } else {
            divisor = BigDecimal.ONE.subtract(pow);
        }
        return (principal.multiply(pow).add(futureValue)).multiply(interestRate).divide(divisor, MathContext.DECIMAL128);
    }
}

这是我的尝试,主要是保持它与Excel具有相同的参数。我从ApachePOI的代码中去掉了它,并将其切换为使用
BigDecimal
s

/**
 * PMT function ported from Excel to Java to use BigDecimals.
 * @param interestRate                   interest rate for the loan.
 * @param numberOfPayments               is the total number of payments for the loan.
 * @param principal                      is the present value; also known as the principal.
 * @param futureValue                    It is the future value, or the balance that you want to have left after the last payment. If fv is omitted, the fv is assumed to be zero.
 * @param paymentsDueAtBeginningOfPeriod payments are due at the beginning of the period.
 * @return payment
 * @see <a href="https://apache.googlesource.com/poi/+/4d81d34d5d566cb22f21999e653a5829cc678ed5/src/java/org/apache/poi/ss/formula/functions/FinanceLib.java#143">FincanceLib</a>
 */
public static BigDecimal pmt(BigDecimal interestRate,
                       int numberOfPayments,
                       BigDecimal principal,
                       BigDecimal futureValue,
                       boolean paymentsDueAtBeginningOfPeriod) {

    final BigDecimal n = new BigDecimal(numberOfPayments);
    if (BigDecimal.ZERO.equals(interestRate)) {
        return (futureValue.add(principal)).divide(n, MathContext.DECIMAL128).negate();
    } else {
        final BigDecimal r1 = interestRate.add(BigDecimal.ONE);
        final BigDecimal pow = r1.pow(numberOfPayments);

        final BigDecimal divisor;
        if (paymentsDueAtBeginningOfPeriod) {
            divisor = r1.multiply(BigDecimal.ONE.subtract(pow));
        } else {
            divisor = BigDecimal.ONE.subtract(pow);
        }
        return (principal.multiply(pow).add(futureValue)).multiply(interestRate).divide(divisor, MathContext.DECIMAL128);
    }
}

apachepoi
有这样的方法,但它在
double
上运行,这对于使用
money
的用例来说不是最好的

public static BigDecimal pmt(BigDecimal rate, Integer months, BigDecimal presentValue, boolean t) {
    BigDecimal result = BigDecimal.ZERO;
    if (rate.compareTo(BigDecimal.ZERO) == 0) {
        result =  new BigDecimal("-1.0").multiply(presentValue).divide(new BigDecimal(months), RoundingMode.HALF_UP);
    } else {
        BigDecimal r1 = rate.add(BigDecimal.ONE);
        BigDecimal opt = t ? r1 : BigDecimal.ONE;
        result = presentValue.multiply(r1.pow(months)).multiply(rate)
                .divide( opt.multiply(BigDecimal.ONE.subtract(r1.pow(months))), RoundingMode.HALF_UP);
    }
    return result;
}
请使用以下名称进行命名:

   BigDecimal testPMT = pmt(new BigDecimal("0.002675"), 25, new BigDecial("300000"), false);
结果:
-12421.758816(…)
-与excel中的相同,
=PMT((0.002675),2530000)

现在,您可以根据自己的需要对结果进行取整

例如:

  BigDecimal roundedPMT = testPMT.setScale(2, RoundingMode.HALF_UP);

apachepoi
有这样的方法,但它在
double
上运行,这对于使用
money
的用例来说不是最好的

public static BigDecimal pmt(BigDecimal rate, Integer months, BigDecimal presentValue, boolean t) {
    BigDecimal result = BigDecimal.ZERO;
    if (rate.compareTo(BigDecimal.ZERO) == 0) {
        result =  new BigDecimal("-1.0").multiply(presentValue).divide(new BigDecimal(months), RoundingMode.HALF_UP);
    } else {
        BigDecimal r1 = rate.add(BigDecimal.ONE);
        BigDecimal opt = t ? r1 : BigDecimal.ONE;
        result = presentValue.multiply(r1.pow(months)).multiply(rate)
                .divide( opt.multiply(BigDecimal.ONE.subtract(r1.pow(months))), RoundingMode.HALF_UP);
    }
    return result;
}
请使用以下名称进行命名:

   BigDecimal testPMT = pmt(new BigDecimal("0.002675"), 25, new BigDecial("300000"), false);
结果:
-12421.758816(…)
-与excel中的相同,
=PMT((0.002675),2530000)

现在,您可以根据自己的需要对结果进行取整

例如:

  BigDecimal roundedPMT = testPMT.setScale(2, RoundingMode.HALF_UP);

我试过上面所有的公式,但都没有给出准确的结果。因此,在实际公式的帮助下找到了解决方案

EMI=[p x R x(1+R)^N]/[(1+R)^N-1]

在哪里 EMI是相等的每月分期付款 P是作为贷款借入的本金或金额 R是对贷款金额征收的利率(利率应为月利率) N是偿还贷款的期限或您将支付的每月分期付款数(期限应以月为单位)

对于下面的java代码

double loanAmt = 100000;
double roi = 9.65;
int timePeriod = 60;

double emi = (loanAmt * (roi/12)/100 * Math.pow((1+(roi/12)/100),timePeriod))/(Math.pow(1+(roi/12)/100, timePeriod)-1);

EMI为2107.52

我尝试了上述所有公式,但没有给出准确的结果。因此,在实际公式的帮助下找到了解决方案

EMI=[p x R x(1+R)^N]/[(1+R)^N-1]

在哪里 EMI是相等的每月分期付款 P是作为贷款借入的本金或金额 R是对贷款金额征收的利率(利率应为月利率) N是偿还贷款的期限或您将支付的每月分期付款数(期限应以月为单位)

对于下面的java代码

double loanAmt = 100000;
double roi = 9.65;
int timePeriod = 60;

double emi = (loanAmt * (roi/12)/100 * Math.pow((1+(roi/12)/100),timePeriod))/(Math.pow(1+(roi/12)/100, timePeriod)-1);


EMI为2107.52,您的问题是?
^
操作符?剩下的基础数学在Java中没有什么不同。你的问题是?
^
操作符?剩下的基础数学在Java中没有什么不同,我已经解决了。您的实现并不完全正确,但它帮助我做到了这一点。谢谢。双v=(1+(D9/12));双t=((D11/12)*12);双结果=(D7*(D9/12))/(1-数学功率(v,t));我已经解决了。您的实现并不完全正确,但它帮助我做到了这一点。谢谢。双v=(1+(D9/12));双t=((D11/12)*12);双结果=(D7*(D9/12))/(1-数学功率(v,t));你是如何在安卓系统中使用它的?我是说你是怎么在gradle的Android系统中导入这个的?弄明白了
从这里下载了jar
http://www.java2s.com/Code/Jar/p/Downloadpoi39jar.htm
并将其包含在
libs
中。在Apache POI版本4.1.1中,函数在org.Apache.POI.ss.formula.functions.finance类中。如果这里的利率是年利率或月利率,那么这个数字是如何计算的?>>0.0074026086您是如何在Android中使用此功能的?我是说你是怎么在gradle的Android系统中导入这个的?弄明白了
从这里下载了jar
http://www.java2s.com/Code/Jar/p/Downloadpoi39jar.htm
并将其包含在
libs
中。在Apache POI版本4.1.1中,函数在org.Apache.POI.ss.formula.functions.finance类中。如果这里的利率是年利率或月利率,那么这个数字是如何计算的?>>0.0074026086D11,期限以月为单位?@ShubhamA。是的,3年,期限是3*12=36D11,期限是个月?@ShubhamA。是的,3年,如果您使用的是