一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java中每月等額與先息后本計算

java中每月等額與先息后本計算

2020-09-03 13:45boldwei Java教程

一般信用貸款會提供兩種還款方式:每月等額或者先息后本。每月等額,就是每月歸還等同的部分本金和利息,你手里在使用的本金其實是逐月減少的。先息后本就是先還利息,到期歸還本金。本文將介紹他們的實現方法。具有很

一般信用貸款會提供兩種還款方式:每月等額或者先息后本。每月等額,就是每月歸還等同的部分本金和利息,你手里在使用的本金其實是逐月減少的。先息后本就是先還利息,到期歸還本金。

每月等額

java" id="highlighter_724876">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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);
 }
}

先息后本

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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;
        }
    }
  }

*金額計算工具類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
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);
    }
  }

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!

原文鏈接:http://www.cnblogs.com/seekingway/p/6635260.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 激情亚洲天堂 | 国产成人永久免费视 | 好湿好滑好硬好爽好深视频 | 色倩网站 | xxx美国| 四虎在线视频免费观看视频 | 成人在线日韩 | 五月天91| 久久精品亚洲精品国产欧美 | 欧美四区 | jk制服白丝超短裙流白浆 | eee在线播放成人免费 | 香蕉视频在线观看网站 | 日本一区二区三区久久精品 | 日韩免费在线视频观看 | 色v在线| 久久青青草原精品国产软件 | 美女和男生搞基 | 日本xxxxx69hd日本 | 欧美专区在线观看 | 国产成人理在线观看视频 | 五月天精品视频播放在线观看 | 四虎影院网址大全 | 男男调教打屁股 | 日本老头4569gay | 免费观看欧美性一级 | 大学生按摩黄a级中文片 | 午夜dj影院在线观看完整版 | 98精品全国免费观看视频 | 3d动漫美女物被遭强视频 | 亚洲美女人黄网成人女 | 男人曰女人 | 毛片一区二区三区提莫影院 | 91传媒在线观看 | 久久久影院亚洲精品 | 精品高潮呻吟99AV无码 | 欧美一级专区免费大片俄罗斯 | 久久re热在线视频精6 | 亚洲精品久久麻豆蜜桃 | 国产一卡二卡3卡4卡四卡在线 | 久久精品热在线观看85 |