• 等额本息
  • 等额本金
  • 提前还款
    • 全部提前还款

      • 等额本息
      • 等额本金
    • 部分提前还款
      • 保持月供不变

        • 等额本息
        • 等额本金
      • 保持期数不变
        • 等额本息
        • 等额本金

废话说在前头,本人公司做银行APP,每次写到贷款计算器总是一遍又一遍研究计算公式。N次过后,还是决定写一篇blog分享给大家。

注:利率一律按照4.9计算。所有计算结果参照在线贷款计算公式

等额本息

每月还款本金+利息一样。
贷款本金100万,贷款期限30年,贷款利息91万元(近似值),那么月供191万元/360月。

 /*** 计算等额本息还款** @param principal 贷款总额* @param months    贷款期限* @param rate      贷款利率* @return*/public static String[] calculateEqualPrincipalAndInterest(double principal, int months, double rate) {ArrayList<String> data = new ArrayList<String>();double monthRate = rate / (100 * 12);//月利率double preLoan = (principal * monthRate * Math.pow((1 + monthRate), months)) / (Math.pow((1 + monthRate), months) - 1);//每月还款金额double totalMoney = preLoan * months;//还款总额double interest = totalMoney - principal;//还款总利息data.add(FORMAT.format(totalMoney));//还款总额data.add(FORMAT.format(principal));//贷款总额data.add(FORMAT.format(interest));//还款总利息data.add(FORMAT.format(preLoan));//每月还款金额data.add(String.valueOf(months));//还款期限return data.toArray(new String[data.size()]);}

运行结果:

在线计算结果:

等额本金

贷款本金100万,贷款期限30年。每月还款本金=100万/360月,每月还款利息=剩余贷款金额*月利率。所以每月利息递减。

/*** 计算等额本金还款** @param principal 贷款总额* @param months    贷款期限* @param rate      贷款利率* @return*/public static String[] calculateEqualPrincipal(double principal, int months, double rate) {ArrayList<String> data = new ArrayList<String>();double monthRate = rate / (100 * 12);//月利率double prePrincipal = principal / months;//每月还款本金double firstMonth = prePrincipal + principal * monthRate;//第一个月还款金额double decreaseMonth = prePrincipal * monthRate;//每月利息递减double interest = (months + 1) * principal * monthRate / 2;//还款总利息double totalMoney = principal + interest;//还款总额data.add(FORMAT.format(totalMoney));//还款总额data.add(FORMAT.format(principal));//贷款总额data.add(FORMAT.format(interest));//还款总利息data.add(FORMAT.format(firstMonth));//首月还款金额data.add(FORMAT.format(decreaseMonth));//每月递减利息data.add(String.valueOf(months));//还款期限return data.toArray(new String[data.size()]);}

运行结果:

在线计算结果:

提前还款

当客户有足够的钱偿还贷款本金时,可以向银行申请提前还款。

全部提前还款

一次性结清贷款

等额本息

扣除之前每月还款的本金(前期还款时,利息占月供很大的比例),剩余贷款金额加上一个月利息即支付金额。

/*** 一次性提前还款计算(等额本息)** @param principal 贷款总额* @param months    贷款期限* @param payTimes  已还次数* @param rate      贷款利率* @return*/public static String[] calculateEqualPrincipalAndInterest(double principal, int months, int payTimes, double rate) {ArrayList<String> data = new ArrayList<String>();double monthRate = rate / (100 * 12);//月利率double preLoan = (principal * monthRate * Math.pow((1 + monthRate), months)) / (Math.pow((1 + monthRate), months) - 1);//每月还款金额double totalMoney = preLoan * months;//还款总额double interest = totalMoney - principal;//还款总利息double leftLoan = principal * Math.pow(1 + monthRate, payTimes) - preLoan * (Math.pow(1 + monthRate, payTimes) - 1) / monthRate;//n个月后欠银行的钱double payLoan = principal - leftLoan;//已还本金double payTotal = preLoan * payTimes;//已还总金额double payInterest = payTotal - payLoan;//已还利息double totalPayAhead = leftLoan * (1 + monthRate);//剩余一次还清double saveInterest = totalMoney - payTotal - totalPayAhead;data.add(FORMAT.format(totalMoney));//原还款总额data.add(FORMAT.format(principal));//贷款总额data.add(FORMAT.format(interest));//原还款总利息data.add(FORMAT.format(preLoan));//原还每月还款金额data.add(FORMAT.format(payTotal));//已还总金额data.add(FORMAT.format(payLoan));//已还本金data.add(FORMAT.format(payInterest));//已还利息data.add(FORMAT.format(totalPayAhead));//一次还清支付金额data.add(FORMAT.format(saveInterest));//节省利息data.add(String.valueOf(0));//剩余还款期限return data.toArray(new String[data.size()]);}

已还款10次,运行结果:

在线计算运行结果:

由此可以看出,前10次还款,扣除本金只占20%左右。

等额本金

    /*** 一次性提前还款计算(等额本金)** @param principal 贷款总额* @param months    贷款期限* @param payTimes  已还次数* @param rate      贷款利率* @return*/public static String[] calculateEqualPrincipal(double principal, int months, int payTimes, double rate) {ArrayList<String> data = new ArrayList<String>();double monthRate = rate / (100 * 12);//月利率double prePrincipal = principal / months;//每月还款本金double firstMonth = prePrincipal + principal * monthRate;//第一个月还款金额double decreaseMonth = prePrincipal * monthRate;//每月利息递减double interest = (months + 1) * principal * monthRate / 2;//还款总利息double totalMoney = principal + interest;//还款总额double payLoan = prePrincipal * payTimes;//已还本金double payInterest = (principal * payTimes - prePrincipal * (payTimes - 1) * payTimes / 2) * monthRate;//已还利息double payTotal = payLoan + payInterest;//已还总额double totalPayAhead = (principal - payLoan) * (1 + monthRate);//提前还款金额(剩余本金加上剩余本金当月利息)double saveInterest = totalMoney - payTotal - totalPayAhead;data.add(FORMAT.format(totalMoney));//原还款总额data.add(FORMAT.format(principal));//贷款总额data.add(FORMAT.format(interest));//原还款总利息data.add(FORMAT.format(firstMonth));//原首月还款金额data.add(FORMAT.format(decreaseMonth));//原每月递减利息data.add(FORMAT.format(payTotal));//已还总金额data.add(FORMAT.format(payLoan));//已还本金data.add(FORMAT.format(payInterest));//已还利息data.add(FORMAT.format(totalPayAhead));//一次还清支付金额data.add(FORMAT.format(saveInterest));//节省利息data.add(String.valueOf(0));//剩余还款期限return data.toArray(new String[data.size()]);}

已还款10次,运行结果:

在线计算运行结果:

对比等额本息,已偿还本金占还款金额30%左右。

部分提前还款

保持月供不变

等额本息
        /*** 部分提前还款计算(等额本息、月供不变)** @param principal      贷款总额* @param months         贷款期限* @param aheadPrincipal 提前还款金额* @param payTimes       已还次数* @param rate           贷款利率* @return*/public static String[] calculateEqualPrincipalAndInterestApart(double principal, int months, double aheadPrincipal, int payTimes, double rate) {ArrayList<String> data = new ArrayList<String>();double monthRate = rate / (100 * 12);//月利率double preLoan = (principal * monthRate * Math.pow((1 + monthRate), months)) / (Math.pow((1 + monthRate), months) - 1);//每月还款金额double totalMoney = preLoan * months;//还款总额double interest = totalMoney - principal;//还款总利息double leftLoanBefore = principal * Math.pow(1 + monthRate, payTimes) - preLoan * (Math.pow(1 + monthRate, payTimes) - 1) / monthRate;//提前还款前欠银行的钱double leftLoan = principal * Math.pow(1 + monthRate, payTimes + 1) - preLoan * (Math.pow(1 + monthRate, payTimes + 1) - 1) / monthRate-aheadPrincipal;//提前还款后欠银行的钱double payLoan = principal - leftLoanBefore;//已还本金double payTotal = preLoan * payTimes ;//已还总金额double payInterest = payTotal - payLoan;//已还利息double aheadTotalMoney = aheadPrincipal + preLoan;//提前还款总额//计算剩余还款期限int leftMonth = (int) Math.floor(Math.log(preLoan / (preLoan - leftLoan * monthRate)) / Math.log(1 + monthRate));double newPreLoan = (leftLoan * monthRate * Math.pow((1 + monthRate), leftMonth)) / (Math.pow((1 + monthRate), leftMonth) - 1);//剩余贷款每月还款金额double leftTotalMoney = newPreLoan * leftMonth;//剩余还款总额double leftInterest = leftTotalMoney - (leftLoan-aheadPrincipal);double saveInterest = totalMoney - aheadTotalMoney - leftTotalMoney-payTotal;data.add(FORMAT.format(totalMoney));//原还款总额data.add(FORMAT.format(principal));//贷款总额data.add(FORMAT.format(interest));//原还款总利息data.add(FORMAT.format(preLoan));//原还每月还款金额data.add(FORMAT.format(payTotal));//已还总金额data.add(FORMAT.format(payLoan));//已还本金data.add(FORMAT.format(payInterest));//已还利息data.add(FORMAT.format(aheadTotalMoney));//提前还款总额data.add(FORMAT.format(leftTotalMoney));//剩余还款总额data.add(FORMAT.format(leftInterest));//剩余还款总利息data.add(FORMAT.format(newPreLoan));//剩余每月还款金额data.add(FORMAT.format(saveInterest));//节省利息data.add(String.valueOf(leftMonth));//剩余还款期限return data.toArray(new String[data.size()]);}

贷款100万,提前还款50万。首次还款:17年8月,提前还款:18年6月。已还次数10次是截止到18年5月。剩余贷款,保持月供不变(大致维持不变),后续需还款114期(9年零6月),所以提前还款后还款日期:18年7月~27年12月。

运行结果:

在线计算结果:(这里有1个月的误差

等额本金
/***  部分提前还款计算(等额本金、月供不变)* @param principal      贷款总额* @param months         贷款期限* @param aheadPrincipal 提前还款金额* @param payTimes       已还次数* @param rate           贷款利率* @return*/public static String[] calculateEqualPrincipalApart(double principal, int months, double aheadPrincipal, int payTimes, double rate) {ArrayList<String> data = new ArrayList<String>();double monthRate = rate / (100 * 12);//月利率double prePrincipal = principal / months;//每月还款本金double firstMonth = prePrincipal + principal * monthRate;//第一个月还款金额double decreaseMonth = prePrincipal * monthRate;//每月利息递减double interest = (months + 1) * principal * monthRate / 2;//还款总利息double totalMoney = principal + interest;//还款总额double payLoan = prePrincipal * payTimes;//已还本金double payInterest = (principal * payTimes - prePrincipal * (payTimes - 1) * payTimes / 2) * monthRate;//已还利息double payTotal = payLoan + payInterest;//已还总额double aheadTotalMoney = (principal - payLoan) *  monthRate+aheadPrincipal+prePrincipal;//提前还款金额double leftLoan = principal - aheadPrincipal - payLoan-prePrincipal;//剩余金额int leftMonth = (int) Math.floor(leftLoan / prePrincipal);double newPrePrincipal = leftLoan / leftMonth;//新的每月还款本金double newFirstMonth = newPrePrincipal + leftLoan * monthRate;//新的第一个月还款金额double newDecreaseMonth = newPrePrincipal * monthRate;//新的每月利息递减double leftInterest = (leftMonth + 1) * leftLoan * monthRate / 2;//还款总利息double leftTotalMoney = leftLoan + leftInterest;//还款总额double saveInterest = totalMoney-payTotal-aheadTotalMoney-leftTotalMoney;data.add(FORMAT.format(totalMoney));//原还款总额data.add(FORMAT.format(principal));//贷款总额data.add(FORMAT.format(interest));//原还款总利息data.add(FORMAT.format(firstMonth));//原还首月还款金额data.add(FORMAT.format(decreaseMonth));//原每月递减利息data.add(FORMAT.format(payTotal));//已还总金额data.add(FORMAT.format(payLoan));//已还本金data.add(FORMAT.format(payInterest));//已还利息data.add(FORMAT.format(aheadTotalMoney));//提前还款总额data.add(FORMAT.format(leftTotalMoney));//剩余还款总额data.add(FORMAT.format(leftInterest));//剩余还款总利息data.add(FORMAT.format(newFirstMonth));//剩余首月还款金额data.add(FORMAT.format(newDecreaseMonth));//剩余月递减利息data.add(FORMAT.format(saveInterest));//节省利息data.add(String.valueOf(leftMonth));//剩余还款期限return data.toArray(new String[data.size()]);}

贷款100万,还款10期后,提前还款50万。

运行结果:

在线计算结果:

保持期数不变

等额本息
    /*** 部分提前还款计算(等额本息、期限不变)* @param principal      贷款总额* @param months         贷款期限* @param aheadPrincipal 提前还款金额* @param payTimes       已还次数* @param rate           贷款利率* @return*/public static String[] calculateEqualPrincipalAndInterestApart2(double principal, int months, double aheadPrincipal, int payTimes, double rate) {ArrayList<String> data = new ArrayList<String>();double monthRate = rate / (100 * 12);//月利率double preLoan = (principal * monthRate * Math.pow((1 + monthRate), months)) / (Math.pow((1 + monthRate), months) - 1);//每月还款金额double totalMoney = preLoan * months;//还款总额double interest = totalMoney - principal;//还款总利息double leftLoanBefore = principal * Math.pow(1 + monthRate, payTimes ) - preLoan * (Math.pow(1 + monthRate, payTimes ) - 1) / monthRate;//提前还款前欠银行的钱double leftLoan = principal * Math.pow(1 + monthRate, payTimes + 1) - preLoan * (Math.pow(1 + monthRate, payTimes + 1) - 1) / monthRate;//提前还款后银行的钱double payLoan = principal - leftLoanBefore;//已还本金double payTotal = preLoan * payTimes;//已还总金额double payInterest = payTotal - payLoan;//已还利息double aheadTotalMoney = preLoan + aheadPrincipal;//下个月还款金额double newPreLoan = ((leftLoan - aheadPrincipal) * monthRate * Math.pow((1 + monthRate), months - payTimes - 1)) / (Math.pow((1 + monthRate), months - payTimes - 1) - 1);//下个月起每月还款金额double leftTotalMoney = newPreLoan*(months-payTimes);double leftInterest =leftTotalMoney -(leftLoan - aheadPrincipal);double saveInterest = totalMoney-payTotal-aheadTotalMoney-leftTotalMoney;data.add(FORMAT.format(totalMoney));//原还款总额data.add(FORMAT.format(principal));//贷款总额data.add(FORMAT.format(interest));//原还款总利息data.add(FORMAT.format(preLoan));//原还每月还款金额data.add(FORMAT.format(payTotal));//已还总金额data.add(FORMAT.format(payLoan));//已还本金data.add(FORMAT.format(payInterest));//已还利息data.add(FORMAT.format(aheadTotalMoney));//提前还款总额data.add(FORMAT.format(leftTotalMoney));//剩余还款总额data.add(FORMAT.format(leftInterest));//剩余还款总利息data.add(FORMAT.format(newPreLoan));//剩余每月还款金额data.add(FORMAT.format(saveInterest));//节省利息data.add(String.valueOf(months));//剩余还款期限return data.toArray(new String[data.size()]);}

运行结果:

在线计算结果:

等额本金
/*** 部分提前还款计算(等额本金、期限不变)* @param principal      贷款总额* @param months         贷款期限* @param aheadPrincipal 提前还款金额* @param payTimes       已还次数* @param rate           贷款利率* @return*/public static String[] calculateEqualPrincipalApart2(double principal, int months, double aheadPrincipal, int payTimes, double rate) {ArrayList<String> data = new ArrayList<String>();double monthRate = rate / (100 * 12);//月利率double prePrincipal = principal / months;//每月还款本金double firstMonth = prePrincipal + principal * monthRate;//第一个月还款金额double decreaseMonth = prePrincipal * monthRate;//每月利息递减double interest = (months + 1) * principal * monthRate / 2;//还款总利息double totalMoney = principal + interest;//还款总额double payLoan = prePrincipal * payTimes;//已还本金double payInterest = (principal * payTimes - prePrincipal * (payTimes - 1) * payTimes / 2) * monthRate;//已还利息double payTotal = payLoan + payInterest;//已还总额double aheadTotalMoney = (principal - payLoan) *  monthRate+aheadPrincipal+prePrincipal;//提前还款金额int leftMonth = months - payTimes-1;double leftLoan = principal - aheadPrincipal - payLoan-prePrincipal;double newPrePrincipal = leftLoan / leftMonth;//新的每月还款本金double newFirstMonth = newPrePrincipal + leftLoan * monthRate;//新的第一个月还款金额double newDecreaseMonth = newPrePrincipal * monthRate;//新的每月利息递减double leftInterest = (leftMonth + 1) * leftLoan * monthRate / 2;//还款总利息double leftTotalMoney = leftLoan + leftInterest;//还款总额double saveInterest = totalMoney-payTotal-aheadTotalMoney-leftTotalMoney;data.add(FORMAT.format(totalMoney));//原还款总额data.add(FORMAT.format(principal));//贷款总额data.add(FORMAT.format(interest));//原还款总利息data.add(FORMAT.format(firstMonth));//原还首月还款金额data.add(FORMAT.format(decreaseMonth));//原每月递减利息data.add(FORMAT.format(payTotal));//已还总金额data.add(FORMAT.format(payLoan));//已还本金data.add(FORMAT.format(payInterest));//已还利息data.add(FORMAT.format(aheadTotalMoney));//提前还款总额data.add(FORMAT.format(leftTotalMoney));//剩余还款总额data.add(FORMAT.format(leftInterest));//剩余还款总利息data.add(FORMAT.format(newFirstMonth));//剩余首月还款金额data.add(FORMAT.format(newDecreaseMonth));//剩余月递减利息data.add(FORMAT.format(saveInterest));//节省利息data.add(String.valueOf(months));//剩余还款期限return data.toArray(new String[data.size()]);}

运行结果:

在线计算结果:

测试数据:

  • 贷款100万
  • 部分提前还款50万
  • 已偿还10期
  • 贷款利率4.9
  • 贷款期限30年

贷款计算公式——java实现相关推荐

  1. 计算公式(java实现)

    import java.util.Stack;public class 计算器 {public static void main(String[] args) {String formula=&quo ...

  2. 点到直线垂足计算公式Java实现

    https://blog.csdn.net/jjwwwww/article/details/83830981转载 方便使用,自己记录一下! 求点到直线垂足 private Point getFoot( ...

  3. 国美金融贷款为虚拟机执行 Java 方法(国美金融贷款存储)

    国美金融贷款虚拟机栈为虚拟机执行 Java 方法(字节码)服务. 国美金融贷款地方法栈(Native Method Stacks)为虚拟机使用到的 Native 方法服务.国美金融贷款Java 堆(J ...

  4. 国美金融贷款Java项目具备关联性和相互依赖性(国美金融贷款)

    如果是国美金融贷款项目,则按以下格式命名: com.公司名.{业务线}.项目名.模块名 如果是国美金融贷款个人项目,则按照以下格式命名: priv.个人名.项目名.模块名 国美金融贷款类命名时要使用名 ...

  5. Java读取Excel,03版本和07版本

    文章目录 java读取Excel 读取Excel的计算公式 java读取Excel 采用poi,这里有个知识点,03版本和07版本的Excel是有区别的,03的最多只有65536行,07的无限制 读取 ...

  6. 购房贷款 等额本息 等额本金

    购房贷款主要有两种方式:等额本息贷款和等额本金贷款.这两种方式最大的不同在于计算利息的方式不同.前者采用的是复合方式计算利息(即本金和利息都要产生利息),后者采用简单方式计算利息(即只有本金产生利息) ...

  7. 【C++】公积金贷款计算器

    发现N年前为了买房贷款写了个计算器,,分享下吧 公积金贷款计算器 /* 等额本金贷款计算公式: 每月还款金额= (贷款本金 / 还款月数)+(本金 - 已归还本金累计额)×每月利率    等额本息每月 ...

  8. 你贷款买房了吗?贷款买房很多学问!不信你就看一看。

    朋友,你贷款买房了吗?你贷款买房时,是不是只看他们用计算器算,而一点没关心你的贷款方式和还款方式?如果是,你就一定遭遇了售房者和银行的忽悠,你将可能多付上万,甚至上十万的利息.不信你就看一看. 贷款计 ...

  9. 核算系统-计息、还款规则

    新浪的贷款计算公式有误 问题描述:等额本息;分期还款,因为精度问题导致各期数的本金总额之和可能等于总本金之和,差别为1分钱.====>要点:1保证总本金正确;2保证每期还款额正确:3.本金多出来 ...

最新文章

  1. 解决WINCE500中INTEL编译器无法完全卸载的问题
  2. 恶心的C语言strtok函数
  3. ASP.NET定时调用WebService 运行后台代码
  4. YbtOJ#20089-[NOIP2020模拟赛B组Day10]平衡的树【贪心】
  5. Iphone屏幕旋转
  6. 【qduoj - 312】寻找唯一的萌妹(卡时)
  7. 红橙Darren视频笔记 仿QQ步数计数view 画笔的使用
  8. 4. linux调用文件计算阶乘前5项和_【题解循环】1091:求阶乘的和
  9. c 压缩java解压文件,java 压缩文件 解压缩文件
  10. 第二次作业(个人作业):软件案例分析
  11. github搭建与遇到的问题
  12. java 数组写入txt_java编程,如何把一个数组中的内容写入一个txt文档中
  13. 细胞生长曲线拟合matlab,绘制细胞生长曲线及细胞群体倍增时间的简化计算
  14. 奇异值分解(SVD)线性变换和几何意义
  15. 信息收集之 子域名收集,子域名爆破
  16. R语言使用order函数对dataframe数据进行排序、基于单个字段(变量)进行降序排序(DESCENDING)
  17. 巴菲特致股东的一封信:2003年
  18. matlab画箱型图均值方差,Matlab 绘制箱线图
  19. nodejs在Linux下使用图片相关模块出现Error: write EPIPE
  20. 机智云物联网技术科普:一文看懂LoRa物联网!

热门文章

  1. Java实现 LeetCode 31下一个排列
  2. jira7.2安装、中文及破解
  3. Android的自定义view的旋转圆形菜单实现
  4. 海康摄像头尾部网线端口线序
  5. c:if标签多条件的逻辑判断
  6. 小爱(小米),天猫精灵(阿里),小度(百度),小艺(华为)智能家居系统选择
  7. TensorFlow基础(1)特点安装基本用法
  8. HTML搜索结果显示,百度搜索结果如何显示你的网站logo及官网?
  9. 产品卖不出去?那你该学学向上销售和交叉销售了
  10. 队列的应用--火车车厢重排列