全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

每月等额

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

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


# 每月等额  # 先息后本  # 等额本息每月本金计算  # Java基于余弦方法实现的计算相似度算法示例  # java计算两个日期之前的天数实例(排除节假日和周末)  # Java简单计算两个日期月数差的方法  # java计算两个日期中间的时间  # Java计算一个数加上100是完全平方数  # 加上168还是完全平方数  # Java小程序计算圆周率代码  # 千分  # 未做  # 两种  # 不去  # 金和  # 手里  # 舍去  # monthRepayment  # SAVEROUNDINGMODE  # BIAPPUtils  # extends  # monthPrincipal  # RepaymentUtils  # MONEYSHOWSCALE  # monthlyInterest  # interest  # MATHCONTEXT  # number  # monthInterest  # setScale 


相关文章: 如何快速完成中国万网建站详细流程?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  如何在阿里云部署织梦网站?    如何在万网自助建站平台快速创建网站?  如何批量查询域名的建站时间记录?  Python lxml的etree和ElementTree有什么区别  北京网站制作公司哪家好一点,北京租房网站有哪些?  电商网站制作公司有哪些,1688网是什么意思?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  建站主机与虚拟主机有何区别?如何选择最优方案?  高端建站如何打造兼具美学与转化的品牌官网?  建站上市公司网站建设方案与SEO优化服务定制指南  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  建站之星上传入口如何快速找到?  建站之星代理如何获取技术支持?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何通过多用户协作模板快速搭建高效企业网站?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  建站之星如何优化SEO以实现高效排名?  浅析上传头像示例及其注意事项  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  ,sp开头的版面叫什么?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  怎么将XML数据可视化 D3.js加载XML  如何快速搭建高效WAP手机网站吸引移动用户?  如何零基础在云服务器搭建WordPress站点?  ,怎么在广州志愿者网站注册?  家庭建站与云服务器建站,如何选择更优?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  建站之星各版本价格是多少?  高防服务器:AI智能防御DDoS攻击与数据安全保障  小建面朝正北,A点实际方位是否存在偏差?  网站制作需要会哪些技术,建立一个网站要花费多少?  建站之星如何实现网站加密操作?  如何生成腾讯云建站专用兑换码?  建站之星价格显示格式升级,你的预算足够吗?  教学网站制作软件,学习*后期制作的网站有哪些?  如何选择适合PHP云建站的开源框架?  山东云建站价格为何差异显著?  官网网站制作腾讯审核要多久,联想路由器newifi官网  深圳网站制作培训,深圳哪些招聘网站比较好?  如何解决VPS建站LNMP环境配置常见问题?  如何高效完成独享虚拟主机建站?  如何快速生成橙子建站落地页链接?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  已有域名和空间,如何快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。