In java the monthly equivalent amount is calculated with interest before capital

  • 2020-06-15 09:07:25
  • OfStack

General credit loans offer two types of repayment: monthly equivalent or interest first followed by principal. The monthly equivalent, is the monthly return of the equivalent part of the principal and interest, your hand in the use of the principal is actually reduced month by month. After the first interest is the first interest, due to repay the principal.

An equal monthly


import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
/**
 * <p>Title:  Equivalent principal and interest repayment instrument </p>
 *
 */
public class CPMUtils{
 /**
 * <p>Description:  Total monthly payment. [Loan principal × monthly interest rate × ( 1 + monthly interest rate ^ Number of repayment months 1 + monthly interest rate) ^ Number of repayment months - 1 : </p>
 * @param principal  Loan principal 
 * @param monthlyInterestRate  An interest 
 * @param amount  nper 
 * @return
 */
 public static BigDecimal monthlyRepayment(BigDecimal principal, BigDecimal monthlyInterestRate, int amount){
 // ( 1 + monthly interest rate) ^ number of repayment months 
 BigDecimal temp = monthlyInterestRate.add(MoneyUtils.ONE).pow(amount);
 return principal.multiply(monthlyInterestRate)
   .multiply(temp)
   .divide(temp.subtract(MoneyUtils.ONE), MoneyUtils.MATHCONTEXT);
 }
 /**
 * <p>Description:  Pay the interest monthly. (Loan principal x monthly interest rate - Monthly payment) * ( 1+ An interest )^ (Current period -1 ) + Monthly payments </p>
 * @param principal  Loan principal 
 * @param monthlyInterestRate  An interest 
 * @param monthlyRepayment  Monthly payments 
 * @param number  The current period according 
 * @return
 */
 public static BigDecimal monthlyInterest(BigDecimal principal, BigDecimal monthlyInterestRate, BigDecimal monthlyRepayment, int number){
 // ( 1+ An interest )^ (Current period -1 ) 
 BigDecimal temp = monthlyInterestRate.add(MoneyUtils.ONE).pow(number - 1);
 return principal.multiply(monthlyInterestRate)
   .subtract(monthlyRepayment)
   .multiply(temp).add(monthlyRepayment, MoneyUtils.MATHCONTEXT);
 }
 /**
 * <p>Description:  Pay the total interest. Number of periods × loan principal × monthly interest rate × ( 1 + monthly interest rate) ^ Number of stages ÷ [( 1 + monthly interest rate) ^ Periods - 1 ] - Loan principal  </p>
 * @param principal  Loan principal 
 * @param monthlyInterestRate  An interest 
 * @param amount  Repayment periods 
 * @return
 */
 public static BigDecimal interest(BigDecimal principal, BigDecimal monthlyInterestRate, int amount){
 // ( 1 + monthly interest rate) ^ nper 
 BigDecimal temp = monthlyInterestRate.add(MoneyUtils.ONE).pow(amount);
 return new BigDecimal(amount)
   .multiply(principal)
   .multiply(monthlyInterestRate)
   .multiply(temp)
   .divide(temp.subtract(MoneyUtils.ONE), MoneyUtils.MATHCONTEXT)
   .subtract(principal, MoneyUtils.MATHCONTEXT);
 }
 /**
 * <p>Description:  Pay the principal monthly. Accurate to the decimal point, no unit conversion </p>
 * @param principal  Loan principal 
 * @param monthlyInterestRate  An interest 
 * @param monthlyRepayment  Monthly payments 
 * @param number  The current period according 
 * @return
 */
 public static BigDecimal monthlyPrincipal(BigDecimal principal, BigDecimal monthlyInterestRate, BigDecimal monthlyRepayment, int number){
 BigDecimal monthInterest = monthlyInterest(principal, monthlyInterestRate, monthlyRepayment, number);
 // Monthly payments - Monthly interest repayment 
 return monthlyRepayment.subtract(monthInterest).setScale(MoneyUtils.MONEYSHOWSCALE, MoneyUtils.SAVEROUNDINGMODE);
 }
 /**
 * <p>Description:  Pay the principal monthly. Accurate to the decimal point, no unit conversion </p>
 * @param monthRepayment  Total monthly repayment 
 * @param monthInterest  Monthly interest repayment 
 * @return
 */
 public static BigDecimal monthPrincipal(BigDecimal monthRepayment, BigDecimal monthInterest){
 // Total monthly repayment - Monthly interest repayment 
 return monthRepayment.subtract(monthInterest).setScale(MoneyUtils.MONEYSHOWSCALE, MoneyUtils.SAVEROUNDINGMODE);
 }
}

Rate after the first


import java.math.BigDecimal;

  /**
  * <p>Title:  Tool type of repayment after Interest </p>
  */
  public class BIAPPUtils extends RepaymentUtils {

    /**
    * <p>Description:  Monthly interest repayment   Loan principal x monthly interest rate  </p>
    * @param loan  Loan principal 
    * @param monthlyInterestRate  An interest 
    * @return
    */
    public static BigDecimal monthlyInterest(BigDecimal loan, BigDecimal monthlyInterestRate){
      return loan.multiply(monthlyInterestRate, MoneyUtils.MATHCONTEXT);
    }
    /**
    * <p>Description:  Total interest paid   Loan principal x monthly interest rate x number of periods </p>
    * @param loan  Loan principal 
    * @param monthlyInterestRate  An interest 
    * @param number  nper 
    * @return
    */
    public static BigDecimal interest(BigDecimal loan, BigDecimal monthlyInterestRate, int number){
      return loan.multiply(monthlyInterestRate).multiply(new BigDecimal(number), MoneyUtils.MATHCONTEXT);
    }
    /**
    * <p>Description:  Monthly payments </p>
    * @param loan  Loan principal 
    * @param monthlyInterestRate  An interest 
    * @param amount  nper 
    * @param curNumber  The current period according 
    * @return
    */
    public static BigDecimal monthlyRepayment(BigDecimal loan, BigDecimal monthlyInterestRate, int amount, int curNumber){
        BigDecimal monthlyInterest = monthlyInterest(loan, monthlyInterestRate);
        if(amount == curNumber){
          return monthlyInterest.add(loan, MoneyUtils.MATHCONTEXT);// Final monthly payment 
        }else{
          return monthlyInterest;
        }
    }
  }

* Amount calculation tool class


import java.math.BigDecimal;
  import java.math.MathContext;
  import java.math.RoundingMode;
  import java.text.NumberFormat;

  public class MoneyUtils {
    /**
    *  Scale (number of decimal places) 
    */
    public static final int SCALE = 10;

    /**
    *  Money display scale (decimal number) 
    */
    public static final int MONEYSHOWSCALE = 2;

    /**
    *  Interest rate display scale (decimal number) 
    */
    public static final int INTERESTRATESHOWSCALE = 4;

    /**
    *  precision 
    */
    public static final int PRECISION = 30;

    /**
    *  Save the rounding rule 
    */
    public static final RoundingMode SAVEROUNDINGMODE = RoundingMode.HALF_UP;

    /**
    *  Whether to leave out the last zero of the decimal point 
    */
    public static boolean STRIPTRAILINGZEROS = true;

    /**
    *  Operation context (setting precision, rounding rules) 
    */
    public static final MathContext MATHCONTEXT = new MathContext(PRECISION, SAVEROUNDINGMODE);

    /**
    *  Number of days each year 
    */
    public static final String YEARDAYS = "360";

    /**
    *  Every months 
    */
    public static final String YEARMOTHS = "12";

    /**
    *  Number of days a month 
    */
    public static final String MOTHDAYS = "30";

    /**
    *  The number" 1 " 
    */
    public static final BigDecimal ONE = new BigDecimal(1);

    /**
    *  The number" 100 " 
    */
    public static final BigDecimal HUNDRED = new BigDecimal(100);

    /**
    *  The number" 0.01 " 
    */
    public static final BigDecimal ONEHUNDREDTH = new BigDecimal(0.01);

    public static BigDecimal newBigDecimal(String str){
      return (str == null || str.trim().isEmpty()) ? BigDecimal.ZERO : new BigDecimal(str);
    }

    /**
    * <p>Description:  Addition returns the formatted result number </p>
    * @param addend
    * @param augend
    * @return
    */
    public static BigDecimal add(BigDecimal addend, BigDecimal augend){
      return formatMoney(addend.add(augend, MATHCONTEXT));
    }

   /**
    * <p>Description:  Addition returns the formatted result number </p>
    * @param addend
    * @param augend
    * @return
    */
    public static BigDecimal add(String addend, String augend){
      BigDecimal decimalAddend = newBigDecimal(addend);
      BigDecimal decimalAugend = newBigDecimal(augend);
      return formatMoney(decimalAddend.add(decimalAugend, MATHCONTEXT));
    }

    /**
    * <p>Description:  Addition returns a formatted result string </p>
    * @param addend
    * @param augend
    * @return
    */
    public static String addToString(BigDecimal addend, BigDecimal augend){
      return formatToString(addend.add(augend, MATHCONTEXT));
    }

    /**
    * <p>Description:  Addition returns a formatted result string </p>
    * @param addend
    * @param augend
    * @return
    */
    public static String addToString(String addend, String augend){
      BigDecimal decimalAddend = newBigDecimal(addend);
      BigDecimal decimalAugend = newBigDecimal(augend);
      return formatToString(decimalAddend.add(decimalAugend, MATHCONTEXT));
    }

    /**
    * <p>Description:  Subtraction returns the formatted result number </p>
    * @param minuend
    * @param subtrahend
    * @return
    */
    public static BigDecimal subtract(BigDecimal minuend, BigDecimal subtrahend){
      return formatMoney(minuend.subtract(subtrahend, MATHCONTEXT));
    }

    /**
    * <p>Description:  Subtraction returns the formatted result number </p>
    * @param minuend
    * @param subtrahend
    * @return
    */
    public static BigDecimal subtract(String minuend, String subtrahend){
      BigDecimal decimalMinuend = newBigDecimal(minuend);
      BigDecimal decimalSubtrahend = newBigDecimal(subtrahend);
      return formatMoney(decimalMinuend.subtract(decimalSubtrahend, MATHCONTEXT));
    }

    /**
    * <p>Description:  Subtraction returns a formatted result string </p>
    * @param minuend
    * @param subtrahend
    * @return
    */
    public static String subtractToString(BigDecimal minuend, BigDecimal subtrahend){
      return formatToString(minuend.subtract(subtrahend, MATHCONTEXT));
    }
    /**
    * <p>Description:  Subtraction returns a formatted result string </p>
    * @param minuend
    * @param subtrahend
    * @return
    */
    public static String subtractToString(String minuend, String subtrahend){
      BigDecimal decimalMinuend = newBigDecimal(minuend);
      BigDecimal decimalSubtrahend = newBigDecimal(subtrahend);
      return formatToString(decimalMinuend.subtract(decimalSubtrahend, MATHCONTEXT));
    }

    /**
    * <p>Description:  Multiplication returns the number of formatted results </p>
    * @param multiplier
    * @param multiplicand
    * @return
    */
    public static BigDecimal multiply(BigDecimal multiplier, BigDecimal multiplicand){
      return formatMoney(multiplier.multiply(multiplicand, MATHCONTEXT));
    }

    /**
    * <p>Description:  Multiplication returns the number of formatted results </p>
    * @param multiplier
    * @param multiplicand
    * @return
    */
    public static BigDecimal multiply(String multiplier, String multiplicand){
      BigDecimal decimalMultiplier = newBigDecimal(multiplier);
      BigDecimal decimalMultiplicand = newBigDecimal(multiplicand);
      return formatMoney(decimalMultiplier.multiply(decimalMultiplicand, MATHCONTEXT));
    }

    /**
    * <p>Description:  Multiplication returns a formatted result string </p>
    * @param multiplier
    * @param multiplicand
    * @return
    */
    public static String multiplyToString(BigDecimal multiplier, BigDecimal multiplicand){
      return formatToString(multiplier.multiply(multiplicand, MATHCONTEXT));
    }
    /**
    * <p>Description:  Multiplication returns a formatted result string </p>
    * @param multiplier
    * @param multiplicand
    * @return
    */
    public static String multiplyToString(String multiplier, String multiplicand){
      BigDecimal decimalMultiplier = newBigDecimal(multiplier);
      BigDecimal decimalMultiplicand = newBigDecimal(multiplicand);
      return formatToString(decimalMultiplier.multiply(decimalMultiplicand, MATHCONTEXT));
    }

    /**
    * <p>Description:  Division returns the formatted result number </p>
    * @param dividend
    * @param divisor
    * @return
    */
    public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor){
      return formatMoney(dividend.divide(divisor, MATHCONTEXT));
    }
    /**
    * <p>Description:  Division returns the formatted result number </p>
    * @param dividend
    * @param divisor
    * @return
    */
    public static BigDecimal divide(String dividend, String divisor){
      BigDecimal decimalDividend = newBigDecimal(dividend);
      BigDecimal decimalDivisor = newBigDecimal(divisor);
      return formatMoney(decimalDividend.divide(decimalDivisor, MATHCONTEXT));
    }

    /**
    * <p>Description:  Division returns a formatted result string </p>
    * @param dividend
    * @param divisor
    * @return
    */
    public static String divideToString(BigDecimal dividend, BigDecimal divisor){
      return formatToString(dividend.divide(divisor, MATHCONTEXT));
    }

    /**
    * <p>Description:  Division returns a formatted result string </p>
    * @param dividend
    * @param divisor
    * @return
    */
    public static String divideToString(String dividend, String divisor){
      BigDecimal decimalDividend = newBigDecimal(dividend);
      BigDecimal decimalDivisor = newBigDecimal(divisor);
      return formatToString(decimalDividend.divide(decimalDivisor, MATHCONTEXT));
    }
    /**
    * <p>Description:  Monthly interest rate calculation </p>
    * @param yearInterestRate
    * @return
    */
    public static BigDecimal monthInterestRate(BigDecimal yearInterestRate){
      BigDecimal dayInterestRate = MoneyUtils.divide(yearInterestRate, YEARDAYS).setScale(5, RoundingMode.CEILING);
      System.err.println(dayInterestRate);
      BigDecimal monthInterestRate = dayInterestRate.multiply(newBigDecimal(MOTHDAYS));
      System.err.println(monthInterestRate);
      return monthInterestRate;
    }

    /**
    * <p>Description:  Save the formatted amount to a given decimal number </p>
    * @param result
    * @return
    */
    public static BigDecimal formatMoney(BigDecimal result){
      return result.setScale(SCALE, SAVEROUNDINGMODE);
    }

    /**
    * <p>Description:  Formatted amount displayed in a given decimal number </p>
    * @param resultStr  The number to format 
    * @param multiple  Multiple of 
    * @return
    */
    public static String formatMoneyToShow(String resultStr, BigDecimal multiple){
      BigDecimal result = newBigDecimal(resultStr);
      return MoneyUtils.formatToString(MoneyUtils.formatMoneyToShow(result, multiple));
    }

    /**
    * <p>Description:  Formatted amount displayed in a given decimal number </p>
    * @param result  The number to format 
    * @param multiple  Multiple of 
    * @return
    */
    public static BigDecimal formatMoneyToShow(BigDecimal result, BigDecimal multiple){
      return result.multiply(multiple).setScale(MONEYSHOWSCALE, SAVEROUNDINGMODE);
    }

    /**
    * <p>Description:  Displayed at a set decimal formatting rate </p>
    * @param result  The number to format 
    * @param multiple  Multiple of 
    * @return
    */
    public static BigDecimal formatInterestRateToShow(BigDecimal result, BigDecimal multiple){
      return result.multiply(multiple).setScale(INTERESTRATESHOWSCALE, SAVEROUNDINGMODE);
    }

    /**
    * <p>Description:  Formatted display for a given number of decimal places </p>
    * @param result  The number to format 
    * @param scale  Display scale (decimal number) 
    * @return
    */
    public static BigDecimal formatToShow(BigDecimal result, int scale){
      return result.setScale(scale, SAVEROUNDINGMODE);
    }

    /**
    * <p>Description:  Format as a string to perform a zero not zero operation </p>
    * @param result
    * @return
    */
    public static String formatToString(BigDecimal result){
      if(result == null){
        return "";
      }else{
        return STRIPTRAILINGZEROS ? result.stripTrailingZeros().toPlainString() : result.toPlainString();
      }
    }

    /**
    * <p>Description:  Format to a currency in a given number of decimal places </p>
    * @param result
    * @return
    */
    public static String formatToCurrency(BigDecimal result){
      BigDecimal temp = result.divide(HUNDRED, SAVEROUNDINGMODE);
      NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
      return numberFormat.format(STRIPTRAILINGZEROS ? temp.stripTrailingZeros() : temp);
    }

    public static String formatToPercent(BigDecimal result){
      BigDecimal temp = result.divide(HUNDRED, SAVEROUNDINGMODE);
      NumberFormat numberFormat = NumberFormat.getPercentInstance();
      return numberFormat.format(STRIPTRAILINGZEROS ? temp.stripTrailingZeros() : temp);
    }

    /** 
    * <p>Description: Format Numbers to display in thousandths;  </p>
    * @param text 
    * @return 
    */ 
    public static String fmtMicrometer(String text){ 
      DecimalFormat df = null; 
      if(text.indexOf(".") > 0) { 
        if(text.length() - text.indexOf(".")-1 == 0){ 
          df = new DecimalFormat("###,##0."); 
        }else if(text.length() - text.indexOf(".")-1 == 1){ 
          df = new DecimalFormat("###,##0.0"); 
        }else { 
          df = new DecimalFormat("###,##0.00"); 
        } 
      }else{ 
        df = new DecimalFormat("###,##0.00"); 
      } 
      double number = 0.0; 
      try { 
        number = Double.parseDouble(text); 
      } catch (Exception e) { 
        number = 0.0; 
      } 
      return df.format(number); 
    }
  }

Related articles: