欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java中每月等额与先息后本计算

程序员文章站 2024-03-02 16:30:46
一般信用贷款会提供两种还款方式:每月等额或者先息后本。每月等额,就是每月归还等同的部分本金和利息,你手里在使用的本金其实是逐月减少的。先息后本就是先还利息,到期归还本金。...

一般信用贷款会提供两种还款方式:每月等额或者先息后本。每月等额,就是每月归还等同的部分本金和利息,你手里在使用的本金其实是逐月减少的。先息后本就是先还利息,到期归还本金。

每月等额

import java.math.bigdecimal;
import java.util.calendar;
import java.util.date;
/**
 * <p>title: 等额本息还款工具类</p>
 *
 */
public class cpmutils{
 /**
 * <p>description: 每月还款总额。〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数-1〕</p>
 * @param principal 贷款本金
 * @param monthlyinterestrate 月利率
 * @param amount 期数
 * @return
 */
 public static bigdecimal monthlyrepayment(bigdecimal principal, bigdecimal monthlyinterestrate, int amount){
 //(1+月利率)^还款月数
 bigdecimal temp = monthlyinterestrate.add(moneyutils.one).pow(amount);
 return principal.multiply(monthlyinterestrate)
   .multiply(temp)
   .divide(temp.subtract(moneyutils.one), moneyutils.mathcontext);
 }
 /**
 * <p>description: 月还款利息。(贷款本金×月利率-月还款额)*(1+月利率)^(当前期数-1)+月还款额</p>
 * @param principal 贷款本金
 * @param monthlyinterestrate 月利率
 * @param monthlyrepayment 月还款额
 * @param number 当前期数
 * @return
 */
 public static bigdecimal monthlyinterest(bigdecimal principal, bigdecimal monthlyinterestrate, bigdecimal monthlyrepayment, int number){
 //(1+月利率)^(当前期数-1)
 bigdecimal temp = monthlyinterestrate.add(moneyutils.one).pow(number - 1);
 return principal.multiply(monthlyinterestrate)
   .subtract(monthlyrepayment)
   .multiply(temp).add(monthlyrepayment, moneyutils.mathcontext);
 }
 /**
 * <p>description: 还款总利息。期数×贷款本金×月利率×(1+月利率)^期数÷〔(1+月利率)^期数-1〕-贷款本金 </p>
 * @param principal 贷款本金
 * @param monthlyinterestrate 月利率
 * @param amount 还款期数
 * @return
 */
 public static bigdecimal interest(bigdecimal principal, bigdecimal monthlyinterestrate, int amount){
 //(1+月利率)^期数
 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: 月还款本金。已经精确到分位,未做单位换算</p>
 * @param principal 贷款本金
 * @param monthlyinterestrate 月利率
 * @param monthlyrepayment 月还款额
 * @param number 当前期数
 * @return
 */
 public static bigdecimal monthlyprincipal(bigdecimal principal, bigdecimal monthlyinterestrate, bigdecimal monthlyrepayment, int number){
 bigdecimal monthinterest = monthlyinterest(principal, monthlyinterestrate, monthlyrepayment, number);
 //月还款额-月还款利息
 return monthlyrepayment.subtract(monthinterest).setscale(moneyutils.moneyshowscale, moneyutils.saveroundingmode);
 }
 /**
 * <p>description: 月还款本金。已经精确到分位,未做单位换算</p>
 * @param monthrepayment 月还款总额
 * @param monthinterest 月还款利息
 * @return
 */
 public static bigdecimal monthprincipal(bigdecimal monthrepayment, bigdecimal monthinterest){
 //月还款总额-月还款利息
 return monthrepayment.subtract(monthinterest).setscale(moneyutils.moneyshowscale, moneyutils.saveroundingmode);
 }
}

先息后本

import java.math.bigdecimal;

  /**
  * <p>title: 先息后本还款方式工具类型</p>
  */
  public class biapputils extends repaymentutils {

    /**
    * <p>description: 月还款利息 贷款本金×月利率 </p>
    * @param loan 贷款本金
    * @param monthlyinterestrate 月利率
    * @return
    */
    public static bigdecimal monthlyinterest(bigdecimal loan, bigdecimal monthlyinterestrate){
      return loan.multiply(monthlyinterestrate, moneyutils.mathcontext);
    }
    /**
    * <p>description: 还款总利息 贷款本金×月利率×期数</p>
    * @param loan 贷款本金
    * @param monthlyinterestrate 月利率
    * @param number 期数
    * @return
    */
    public static bigdecimal interest(bigdecimal loan, bigdecimal monthlyinterestrate, int number){
      return loan.multiply(monthlyinterestrate).multiply(new bigdecimal(number), moneyutils.mathcontext);
    }
    /**
    * <p>description: 月还款额</p>
    * @param loan 贷款本金
    * @param monthlyinterestrate 月利率
    * @param amount 期数
    * @param curnumber 当前期数
    * @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);//最后月还款额
        }else{
          return monthlyinterest;
        }
    }
  }

*金额计算工具类

import java.math.bigdecimal;
  import java.math.mathcontext;
  import java.math.roundingmode;
  import java.text.numberformat;

  public class moneyutils {
    /**
    * 标度(小数位数)
    */
    public static final int scale = 10;

    /**
    * 金钱显示标度(小数位数)
    */
    public static final int moneyshowscale = 2;

    /**
    * 利率显示标度(小数位数)
    */
    public static final int interestrateshowscale = 4;

    /**
    * 精度
    */
    public static final int precision = 30;

    /**
    * 保存舍入规则
    */
    public static final roundingmode saveroundingmode = roundingmode.half_up;

    /**
    * 是否舍去小数点最后的零
    */
    public static boolean striptrailingzeros = true;

    /**
    * 运算上下文(设置精度、舍入规则)
    */
    public static final mathcontext mathcontext = new mathcontext(precision, saveroundingmode);

    /**
    * 每年天数
    */
    public static final string yeardays = "360";

    /**
    * 每年月数
    */
    public static final string yearmoths = "12";

    /**
    * 每月天数
    */
    public static final string mothdays = "30";

    /**
    * 数字“1”
    */
    public static final bigdecimal one = new bigdecimal(1);

    /**
    * 数字“100”
    */
    public static final bigdecimal hundred = new bigdecimal(100);

    /**
    * 数字“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: 加法返回格式化结果数字</p>
    * @param addend
    * @param augend
    * @return
    */
    public static bigdecimal add(bigdecimal addend, bigdecimal augend){
      return formatmoney(addend.add(augend, mathcontext));
    }

   /**
    * <p>description: 加法返回格式化结果数字</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: 加法返回格式化结果字符串</p>
    * @param addend
    * @param augend
    * @return
    */
    public static string addtostring(bigdecimal addend, bigdecimal augend){
      return formattostring(addend.add(augend, mathcontext));
    }

    /**
    * <p>description: 加法返回格式化结果字符串</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: 减法返回格式化结果数字</p>
    * @param minuend
    * @param subtrahend
    * @return
    */
    public static bigdecimal subtract(bigdecimal minuend, bigdecimal subtrahend){
      return formatmoney(minuend.subtract(subtrahend, mathcontext));
    }

    /**
    * <p>description: 减法返回格式化结果数字</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: 减法返回格式化结果字符串</p>
    * @param minuend
    * @param subtrahend
    * @return
    */
    public static string subtracttostring(bigdecimal minuend, bigdecimal subtrahend){
      return formattostring(minuend.subtract(subtrahend, mathcontext));
    }
    /**
    * <p>description: 减法返回格式化结果字符串</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: 乘法返回格式化结果数字</p>
    * @param multiplier
    * @param multiplicand
    * @return
    */
    public static bigdecimal multiply(bigdecimal multiplier, bigdecimal multiplicand){
      return formatmoney(multiplier.multiply(multiplicand, mathcontext));
    }

    /**
    * <p>description: 乘法返回格式化结果数字</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: 乘法返回格式化结果字符串</p>
    * @param multiplier
    * @param multiplicand
    * @return
    */
    public static string multiplytostring(bigdecimal multiplier, bigdecimal multiplicand){
      return formattostring(multiplier.multiply(multiplicand, mathcontext));
    }
    /**
    * <p>description: 乘法返回格式化结果字符串</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: 除法返回格式化结果数字</p>
    * @param dividend
    * @param divisor
    * @return
    */
    public static bigdecimal divide(bigdecimal dividend, bigdecimal divisor){
      return formatmoney(dividend.divide(divisor, mathcontext));
    }
    /**
    * <p>description: 除法返回格式化结果数字</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: 除法返回格式化结果字符串</p>
    * @param dividend
    * @param divisor
    * @return
    */
    public static string dividetostring(bigdecimal dividend, bigdecimal divisor){
      return formattostring(dividend.divide(divisor, mathcontext));
    }

    /**
    * <p>description: 除法返回格式化结果字符串</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: 月利率计算</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: 按既定小数位数格式化金额保存</p>
    * @param result
    * @return
    */
    public static bigdecimal formatmoney(bigdecimal result){
      return result.setscale(scale, saveroundingmode);
    }

    /**
    * <p>description: 按既定小数位数格式化金额显示</p>
    * @param resultstr 要格式化的数
    * @param multiple 乘以的倍数
    * @return
    */
    public static string formatmoneytoshow(string resultstr, bigdecimal multiple){
      bigdecimal result = newbigdecimal(resultstr);
      return moneyutils.formattostring(moneyutils.formatmoneytoshow(result, multiple));
    }

    /**
    * <p>description: 按既定小数位数格式化金额显示</p>
    * @param result 要格式化的数
    * @param multiple 乘以的倍数
    * @return
    */
    public static bigdecimal formatmoneytoshow(bigdecimal result, bigdecimal multiple){
      return result.multiply(multiple).setscale(moneyshowscale, saveroundingmode);
    }

    /**
    * <p>description: 按既定小数位数格式化利率显示</p>
    * @param result 要格式化的数
    * @param multiple 乘以的倍数
    * @return
    */
    public static bigdecimal formatinterestratetoshow(bigdecimal result, bigdecimal multiple){
      return result.multiply(multiple).setscale(interestrateshowscale, saveroundingmode);
    }

    /**
    * <p>description: 按既定小数位数格式化显示</p>
    * @param result 要格式化的数
    * @param scale 显示标度(小数位数)
    * @return
    */
    public static bigdecimal formattoshow(bigdecimal result, int scale){
      return result.setscale(scale, saveroundingmode);
    }

    /**
    * <p>description: 格式化为字符串,进行去零不去零操作</p>
    * @param result
    * @return
    */
    public static string formattostring(bigdecimal result){
      if(result == null){
        return "";
      }else{
        return striptrailingzeros ? result.striptrailingzeros().toplainstring() : result.toplainstring();
      }
    }

    /**
    * <p>description: 按既定小数位数格式化为货币格式</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:格式化数字为千分位显示; </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); 
    }
  }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!