java中每月等额与先息后本计算
一般信用贷款会提供两种还款方式:每月等额或者先息后本。每月等额,就是每月归还等同的部分本金和利息,你手里在使用的本金其实是逐月减少的。先息后本就是先还利息,到期归还本金。
每月等额
1 import java.math.BigDecimal; 2 import java.util.Calendar; 3 import java.util.Date; 4 5 /** 6 * <p>Title: 等额本息还款工具类</p> 7 * 8 */ 9 public class CPMUtils{ 10 11 /** 12 * <p>Description: 每月还款总额。〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数-1〕</p> 13 * @param principal 贷款本金 14 * @param monthlyInterestRate 月利率 15 * @param amount 期数 16 * @return 17 */ 18 public static BigDecimal monthlyRepayment(BigDecimal principal, BigDecimal monthlyInterestRate, int amount){ 19 //(1+月利率)^还款月数 20 BigDecimal temp = monthlyInterestRate.add(MoneyUtils.ONE).pow(amount); 21 return principal.multiply(monthlyInterestRate) 22 .multiply(temp) 23 .divide(temp.subtract(MoneyUtils.ONE), MoneyUtils.MATHCONTEXT); 24 } 25 26 /** 27 * <p>Description: 月还款利息。(贷款本金×月利率-月还款额)*(1+月利率)^(当前期数-1)+月还款额</p> 28 * @param principal 贷款本金 29 * @param monthlyInterestRate 月利率 30 * @param monthlyRepayment 月还款额 31 * @param number 当前期数 32 * @return 33 */ 34 public static BigDecimal monthlyInterest(BigDecimal principal, BigDecimal monthlyInterestRate, BigDecimal monthlyRepayment, int number){ 35 //(1+月利率)^(当前期数-1) 36 BigDecimal temp = monthlyInterestRate.add(MoneyUtils.ONE).pow(number - 1); 37 return principal.multiply(monthlyInterestRate) 38 .subtract(monthlyRepayment) 39 .multiply(temp).add(monthlyRepayment, MoneyUtils.MATHCONTEXT); 41 } 42 43 /** 44 * <p>Description: 还款总利息。期数×贷款本金×月利率×(1+月利率)^期数÷〔(1+月利率)^期数-1〕-贷款本金 </p> 45 * @param principal 贷款本金 46 * @param monthlyInterestRate 月利率 47 * @param amount 还款期数 48 * @return 49 */ 50 public static BigDecimal interest(BigDecimal principal, BigDecimal monthlyInterestRate, int amount){ 51 //(1+月利率)^期数 52 BigDecimal temp = monthlyInterestRate.add(MoneyUtils.ONE).pow(amount); 53 return new BigDecimal(amount) 54 .multiply(principal) 55 .multiply(monthlyInterestRate) 56 .multiply(temp) 57 .divide(temp.subtract(MoneyUtils.ONE), MoneyUtils.MATHCONTEXT) 58 .subtract(principal, MoneyUtils.MATHCONTEXT); 59 } 60 61 /** 62 * <p>Description: 月还款本金。已经精确到分位,未做单位换算</p> 63 * @param principal 贷款本金 64 * @param monthlyInterestRate 月利率 65 * @param monthlyRepayment 月还款额 66 * @param number 当前期数 67 * @return 68 */ 69 public static BigDecimal monthlyPrincipal(BigDecimal principal, BigDecimal monthlyInterestRate, BigDecimal monthlyRepayment, int number){ 70 BigDecimal monthInterest = monthlyInterest(principal, monthlyInterestRate, monthlyRepayment, number); 71 //月还款额-月还款利息 72 return monthlyRepayment.subtract(monthInterest).setScale(MoneyUtils.MONEYSHOWSCALE, MoneyUtils.SAVEROUNDINGMODE); 73 } 74 75 /** 76 * <p>Description: 月还款本金。已经精确到分位,未做单位换算</p> 77 * @param monthRepayment 月还款总额 78 * @param monthInterest 月还款利息 79 * @return 80 */ 81 public static BigDecimal monthPrincipal(BigDecimal monthRepayment, BigDecimal monthInterest){ 82 //月还款总额-月还款利息 83 return monthRepayment.subtract(monthInterest).setScale(MoneyUtils.MONEYSHOWSCALE, MoneyUtils.SAVEROUNDINGMODE); 84 } 85 86 }
先息后本
1 import java.math.BigDecimal; 2 3 /** 4 * <p>Title: 先息后本还款方式工具类型</p> 5 */ 6 public class BIAPPUtils extends RepaymentUtils { 7 8 /** 9 * <p>Description: 月还款利息 贷款本金×月利率 </p> 10 * @param loan 贷款本金 11 * @param monthlyInterestRate 月利率 12 * @return 13 */ 14 public static BigDecimal monthlyInterest(BigDecimal loan, BigDecimal monthlyInterestRate){ 15 return loan.multiply(monthlyInterestRate, MoneyUtils.MATHCONTEXT); 16 } 17 /** 18 * <p>Description: 还款总利息 贷款本金×月利率×期数</p> 19 * @param loan 贷款本金 20 * @param monthlyInterestRate 月利率 21 * @param number 期数 22 * @return 23 */ 24 public static BigDecimal interest(BigDecimal loan, BigDecimal monthlyInterestRate, int number){ 25 return loan.multiply(monthlyInterestRate).multiply(new BigDecimal(number), MoneyUtils.MATHCONTEXT); 26 } 27 /** 28 * <p>Description: 月还款额</p> 29 * @param loan 贷款本金 30 * @param monthlyInterestRate 月利率 31 * @param amount 期数 32 * @param curNumber 当前期数 33 * @return 34 */ 35 public static BigDecimal monthlyRepayment(BigDecimal loan, BigDecimal monthlyInterestRate, int amount, int curNumber){ 36 BigDecimal monthlyInterest = monthlyInterest(loan, monthlyInterestRate); 37 if(amount == curNumber){ 38 return monthlyInterest.add(loan, MoneyUtils.MATHCONTEXT);//最后月还款额 39 }else{ 40 return monthlyInterest; 41 } 42 } 43 }
*金额计算工具类
1 import java.math.BigDecimal; 2 import java.math.MathContext; 3 import java.math.RoundingMode; 4 import java.text.NumberFormat; 5 6 public class MoneyUtils { 7 /** 8 * 标度(小数位数) 9 */ 10 public static final int SCALE = 10; 11 12 /** 13 * 金钱显示标度(小数位数) 14 */ 15 public static final int MONEYSHOWSCALE = 2; 16 17 /** 18 * 利率显示标度(小数位数) 19 */ 20 public static final int INTERESTRATESHOWSCALE = 4; 21 22 /** 23 * 精度 24 */ 25 public static final int PRECISION = 30; 26 27 /** 28 * 保存舍入规则 29 */ 30 public static final RoundingMode SAVEROUNDINGMODE = RoundingMode.HALF_UP; 31 32 /** 33 * 是否舍去小数点最后的零 34 */ 35 public static boolean STRIPTRAILINGZEROS = true; 36 37 /** 38 * 运算上下文(设置精度、舍入规则) 39 */ 40 public static final MathContext MATHCONTEXT = new MathContext(PRECISION, SAVEROUNDINGMODE); 41 42 /** 43 * 每年天数 44 */ 45 public static final String YEARDAYS = "360"; 46 47 /** 48 * 每年月数 49 */ 50 public static final String YEARMOTHS = "12"; 51 52 /** 53 * 每月天数 54 */ 55 public static final String MOTHDAYS = "30"; 56 57 /** 58 * 数字“1” 59 */ 60 public static final BigDecimal ONE = new BigDecimal(1); 61 62 /** 63 * 数字“100” 64 */ 65 public static final BigDecimal HUNDRED = new BigDecimal(100); 66 67 /** 68 * 数字“0.01” 69 */ 70 public static final BigDecimal ONEHUNDREDTH = new BigDecimal(0.01); 71 72 public static BigDecimal newBigDecimal(String str){ 73 return (str == null || str.trim().isEmpty()) ? BigDecimal.ZERO : new BigDecimal(str); 74 } 75 76 /** 77 * <p>Description: 加法返回格式化结果数字</p> 78 * @param addend 79 * @param augend 80 * @return 81 */ 82 public static BigDecimal add(BigDecimal addend, BigDecimal augend){ 83 return formatMoney(addend.add(augend, MATHCONTEXT)); 84 } 85 86 /** 87 * <p>Description: 加法返回格式化结果数字</p> 88 * @param addend 89 * @param augend 90 * @return 91 */ 92 public static BigDecimal add(String addend, String augend){ 93 BigDecimal decimalAddend = newBigDecimal(addend); 94 BigDecimal decimalAugend = newBigDecimal(augend); 95 return formatMoney(decimalAddend.add(decimalAugend, MATHCONTEXT)); 96 } 97 98 /** 99 * <p>Description: 加法返回格式化结果字符串</p> 100 * @param addend 101 * @param augend 102 * @return 103 */ 104 public static String addToString(BigDecimal addend, BigDecimal augend){ 105 return formatToString(addend.add(augend, MATHCONTEXT)); 106 } 107 108 /** 109 * <p>Description: 加法返回格式化结果字符串</p> 110 * @param addend 111 * @param augend 112 * @return 113 */ 114 public static String addToString(String addend, String augend){ 115 BigDecimal decimalAddend = newBigDecimal(addend); 116 BigDecimal decimalAugend = newBigDecimal(augend); 117 return formatToString(decimalAddend.add(decimalAugend, MATHCONTEXT)); 118 } 119 120 /** 121 * <p>Description: 减法返回格式化结果数字</p> 122 * @param minuend 123 * @param subtrahend 124 * @return 125 */ 126 public static BigDecimal subtract(BigDecimal minuend, BigDecimal subtrahend){ 127 return formatMoney(minuend.subtract(subtrahend, MATHCONTEXT)); 128 } 129 130 131 /** 132 * <p>Description: 减法返回格式化结果数字</p> 133 * @param minuend 134 * @param subtrahend 135 * @return 136 */ 137 public static BigDecimal subtract(String minuend, String subtrahend){ 138 BigDecimal decimalMinuend = newBigDecimal(minuend); 139 BigDecimal decimalSubtrahend = newBigDecimal(subtrahend); 140 return formatMoney(decimalMinuend.subtract(decimalSubtrahend, MATHCONTEXT)); 141 } 142 143 /** 144 * <p>Description: 减法返回格式化结果字符串</p> 145 * @param minuend 146 * @param subtrahend 147 * @return 148 */ 149 public static String subtractToString(BigDecimal minuend, BigDecimal subtrahend){ 150 return formatToString(minuend.subtract(subtrahend, MATHCONTEXT)); 151 } 152 /** 153 * <p>Description: 减法返回格式化结果字符串</p> 154 * @param minuend 155 * @param subtrahend 156 * @return 157 */ 158 public static String subtractToString(String minuend, String subtrahend){ 159 BigDecimal decimalMinuend = newBigDecimal(minuend); 160 BigDecimal decimalSubtrahend = newBigDecimal(subtrahend); 161 return formatToString(decimalMinuend.subtract(decimalSubtrahend, MATHCONTEXT)); 162 } 163 164 /** 165 * <p>Description: 乘法返回格式化结果数字</p> 166 * @param multiplier 167 * @param multiplicand 168 * @return 169 */ 170 public static BigDecimal multiply(BigDecimal multiplier, BigDecimal multiplicand){ 171 return formatMoney(multiplier.multiply(multiplicand, MATHCONTEXT)); 172 } 173 174 175 /** 176 * <p>Description: 乘法返回格式化结果数字</p> 177 * @param multiplier 178 * @param multiplicand 179 * @return 180 */ 181 public static BigDecimal multiply(String multiplier, String multiplicand){ 182 BigDecimal decimalMultiplier = newBigDecimal(multiplier); 183 BigDecimal decimalMultiplicand = newBigDecimal(multiplicand); 184 return formatMoney(decimalMultiplier.multiply(decimalMultiplicand, MATHCONTEXT)); 185 } 186 187 /** 188 * <p>Description: 乘法返回格式化结果字符串</p> 189 * @param multiplier 190 * @param multiplicand 191 * @return 192 */ 193 public static String multiplyToString(BigDecimal multiplier, BigDecimal multiplicand){ 194 return formatToString(multiplier.multiply(multiplicand, MATHCONTEXT)); 195 } 196 /** 197 * <p>Description: 乘法返回格式化结果字符串</p> 198 * @param multiplier 199 * @param multiplicand 200 * @return 201 */ 202 public static String multiplyToString(String multiplier, String multiplicand){ 203 BigDecimal decimalMultiplier = newBigDecimal(multiplier); 204 BigDecimal decimalMultiplicand = newBigDecimal(multiplicand); 205 return formatToString(decimalMultiplier.multiply(decimalMultiplicand, MATHCONTEXT)); 206 } 207 208 /** 209 * <p>Description: 除法返回格式化结果数字</p> 210 * @param dividend 211 * @param divisor 212 * @return 213 */ 214 public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor){ 215 return formatMoney(dividend.divide(divisor, MATHCONTEXT)); 216 } 217 /** 218 * <p>Description: 除法返回格式化结果数字</p> 219 * @param dividend 220 * @param divisor 221 * @return 222 */ 223 public static BigDecimal divide(String dividend, String divisor){ 224 BigDecimal decimalDividend = newBigDecimal(dividend); 225 BigDecimal decimalDivisor = newBigDecimal(divisor); 226 return formatMoney(decimalDividend.divide(decimalDivisor, MATHCONTEXT)); 227 } 228 229 /** 230 * <p>Description: 除法返回格式化结果字符串</p> 231 * @param dividend 232 * @param divisor 233 * @return 234 */ 235 public static String divideToString(BigDecimal dividend, BigDecimal divisor){ 236 return formatToString(dividend.divide(divisor, MATHCONTEXT)); 237 } 238 239 /** 240 * <p>Description: 除法返回格式化结果字符串</p> 241 * @param dividend 242 * @param divisor 243 * @return 244 */ 245 public static String divideToString(String dividend, String divisor){ 246 BigDecimal decimalDividend = newBigDecimal(dividend); 247 BigDecimal decimalDivisor = newBigDecimal(divisor); 248 return formatToString(decimalDividend.divide(decimalDivisor, MATHCONTEXT)); 249 } 250 /** 251 * <p>Description: 月利率计算</p> 252 * @param yearInterestRate 253 * @return 254 */ 255 public static BigDecimal monthInterestRate(BigDecimal yearInterestRate){ 256 BigDecimal dayInterestRate = MoneyUtils.divide(yearInterestRate, YEARDAYS).setScale(5, RoundingMode.CEILING); 257 System.err.println(dayInterestRate); 258 BigDecimal monthInterestRate = dayInterestRate.multiply(newBigDecimal(MOTHDAYS)); 259 System.err.println(monthInterestRate); 260 return monthInterestRate; 261 } 262 263 /** 264 * <p>Description: 按既定小数位数格式化金额保存</p> 265 * @param result 266 * @return 267 */ 268 public static BigDecimal formatMoney(BigDecimal result){ 269 return result.setScale(SCALE, SAVEROUNDINGMODE); 270 } 271 272 /** 273 * <p>Description: 按既定小数位数格式化金额显示</p> 274 * @param resultStr 要格式化的数 275 * @param multiple 乘以的倍数 276 * @return 277 */ 278 public static String formatMoneyToShow(String resultStr, BigDecimal multiple){ 279 BigDecimal result = newBigDecimal(resultStr); 280 return MoneyUtils.formatToString(MoneyUtils.formatMoneyToShow(result, multiple)); 281 } 282 283 /** 284 * <p>Description: 按既定小数位数格式化金额显示</p> 285 * @param result 要格式化的数 286 * @param multiple 乘以的倍数 287 * @return 288 */ 289 public static BigDecimal formatMoneyToShow(BigDecimal result, BigDecimal multiple){ 290 return result.multiply(multiple).setScale(MONEYSHOWSCALE, SAVEROUNDINGMODE); 291 } 292 293 /** 294 * <p>Description: 按既定小数位数格式化利率显示</p> 295 * @param result 要格式化的数 296 * @param multiple 乘以的倍数 297 * @return 298 */ 299 public static BigDecimal formatInterestRateToShow(BigDecimal result, BigDecimal multiple){ 300 return result.multiply(multiple).setScale(INTERESTRATESHOWSCALE, SAVEROUNDINGMODE); 301 } 302 303 /** 304 * <p>Description: 按既定小数位数格式化显示</p> 305 * @param result 要格式化的数 306 * @param scale 显示标度(小数位数) 307 * @return 308 */ 309 public static BigDecimal formatToShow(BigDecimal result, int scale){ 310 return result.setScale(scale, SAVEROUNDINGMODE); 311 } 312 313 /** 314 * <p>Description: 格式化为字符串,进行去零不去零操作</p> 315 * @param result 316 * @return 317 */ 318 public static String formatToString(BigDecimal result){ 319 if(result == null){ 320 return ""; 321 }else{ 322 return STRIPTRAILINGZEROS ? result.stripTrailingZeros().toPlainString() : result.toPlainString(); 323 } 324 } 325 326 /** 327 * <p>Description: 按既定小数位数格式化为货币格式</p> 328 * @param result 329 * @return 330 */ 331 public static String formatToCurrency(BigDecimal result){ 332 BigDecimal temp = result.divide(HUNDRED, SAVEROUNDINGMODE); 333 NumberFormat numberFormat = NumberFormat.getCurrencyInstance(); 334 return numberFormat.format(STRIPTRAILINGZEROS ? temp.stripTrailingZeros() : temp); 335 } 336 337 public static String formatToPercent(BigDecimal result){ 338 BigDecimal temp = result.divide(HUNDRED, SAVEROUNDINGMODE); 339 NumberFormat numberFormat = NumberFormat.getPercentInstance(); 340 return numberFormat.format(STRIPTRAILINGZEROS ? temp.stripTrailingZeros() : temp); 341 } 342 343 /** 344 * <p>Description:格式化数字为千分位显示; </p> 345 * @param text 346 * @return 347 */ 348 public static String fmtMicrometer(String text){ 349 DecimalFormat df = null; 350 if(text.indexOf(".") > 0) { 351 if(text.length() - text.indexOf(".")-1 == 0){ 352 df = new DecimalFormat("###,##0."); 353 }else if(text.length() - text.indexOf(".")-1 == 1){ 354 df = new DecimalFormat("###,##0.0"); 355 }else { 356 df = new DecimalFormat("###,##0.00"); 357 } 358 }else{ 359 df = new DecimalFormat("###,##0.00"); 360 } 361 double number = 0.0; 362 try { 363 number = Double.parseDouble(text); 364 } catch (Exception e) { 365 number = 0.0; 366 } 367 return df.format(number); 368 } 369 370 }
转载于:https://www.cnblogs.com/seekingway/p/6635260.html
java中每月等额与先息后本计算相关推荐
- java moneyutils_java中每月等额与先息后本计算
1 importjava.math.BigDecimal;2 importjava.math.MathContext;3 importjava.math.RoundingMode;4 importja ...
- 这是什么操作?java中的变量竟然可以先使用后声明?
相信大家在看到标题之后,是疑惑的点进来看内容的. 在看到标题之后,大家肯定会怀疑,我赵某人用java写了好几年的代码了,还真就没见过java中的变量能先用在声明,今天就是进来看看你在没有声明变量的前提 ...
- java中string类型的哈希值是怎么计算的
在 Java 中,字符串类型的哈希值是通过 String 类的 hashCode() 方法计算的.这个方法会通过将字符串的每个字符转换成一个整数,然后将它们进行某种数学运算来得到最终的哈希值. 具体来 ...
- Java中一年有几周、周的计算
一般情况下java中一年有52周.但52周总共只有52*7=364天.我们知道,平年是365天,闰年则是366天,如果一年只有52周的话,就会差1到2天.所以每过几年,就会出现一年有53周. java ...
- java中审核订单流程图_看95后java妹子横扫阿里,京东,小米,滴滴,美团等大厂,一份热腾腾的面经(最终入职阿里)...
内容目录 头条 美团 滴滴 京东 others 算法题 HR面 tips 自序 这次面试的公司有一点点多,主要是因为毕业后前两份工作找的都很草率,这次换工作就想着,emm,毕业三年了,该找个工作好好沉 ...
- Java中创建对象的六个步骤 细分后(new关键字)对象头详细介绍
要看的懂对象的创建过程,首先你得有对Java虚拟机和Java基础以及JUC很是熟悉, 比如类的加载过程.CAS.多线程.JVM的GC等等 文章目录 一.创建对象的六个步骤: 二.对象头的内部结构 首先 ...
- java中保留两位小数(四舍五入后)
我认为最简单的: import java.text.DecimalFormat; public class format { double d= 111231.5585; System.out.pri ...
- java学习笔记-java中运算符号的优先顺序
java中各种运算符具有优先级顺序,一般会先计算优先级高的,再计算优先级低的.可以使用()使得优先级变为最高. 在算术运算中,优先级为 ++ -- * / + - 在在逻辑运算中的优先级是 ! 取反 ...
- Java中Date各种相关用法
Java中Date各种相关用法 本文主要介绍Java中Date各种相关用法. AD: Java中Date各种相关用法(一) 1.计算某一月份的最大天数 Java代码 Calendar time=C ...
最新文章
- 26期20180626 rpm 安装软件包的方法 yum
- Centos-移动文件或目录-mv
- js 获取时间对象代码
- 递归下降语法分析程序
- X Shell 4配色方案[Solarized Dark]
- android系统可以破吗,你的手机系统破到什么程度?一键查安卓漏洞
- 从零写一个编译器(九):语义分析之构造抽象语法树(AST)
- java utf 8 转unicode_java 在Unicode和UTF-8之间转换
- u盘插在电脑上灯亮没有反应_u盘插入电脑无反应怎么解决 u盘插入电脑无反应解决方法【步骤介绍】...
- java - 抽象类、接口、内部类
- H264所采用的指数格伦布熵编码算法原理及应用
- 春节要闻回顾 | 数字人民币和元宇宙被搬上春晚;美国财政部报告警告NFT可用于洗钱...
- 基于KNN的垃圾邮件分类实验
- HDFS配置之NN-SNN-DN
- 七牛 java 加水印_七牛云图片加水印
- 智慧工厂是什么 智慧工厂方案举例 智慧工厂案例
- 加州大学欧文分校计算机排名,加州大学欧文分校计算机工程硕士排名第30(2020年TFE Times排名)...
- Just For Fun(乐者为王)——Linux创始人
- python 离线安装驱动
- 什么叫侧面指纹识别_新科技?侧面指纹解锁有什么不同?