《PHP与MySQL程序设计(第四版)》中第73页4.2.6节分期还贷计算器数学原理分析

-----------------------------《PHP与MySQL程序设计(第四版)》中第73页4.2.6节分期还贷计算器数学原理分析。
《PHP与MySQL程序设计(第四版)》中73页4.2.6节,代码清单4-1是还贷计算器函数amortizationTable,代码如下。
其使用的是等额本息分期还款模型。要理解这段代码,关键是理解月还款额b的计算公式背后的数学原理。
设本金a,还款月数n,月利率r,每月还款b。还款计算如下:
首月利息a*r,还款后,余额a1=a(1+r)-b;次月利息a1*r,次月还款后余额a2=a1(1+r)-b=(a(1+r)-b)(1+r)-b=a(1+r)^2-b[(1+r)+1],
如此类推,最后一个月还清,有余额an=a(1+r)^n-b[(1+r)^(n-1)+(1+r)^(n-2)+……1]=0。
可见中括号内为等比数列,根据等比数列计算公式可得an=a(1+r)^n-b((1+r)^n-1)/r = 0,所以有b=ar(1+r)^n/((1+r)^n-1)。
代码中,$periodicPayment即b,$balance即a,$intCalc即1+r,$totalPayments即n,所以有
$periodicPayment = $balance * pow($intCalc,$totalPayments) * ($intCalc - 1) /
                                    (pow($intCalc,$totalPayments) - 1);
回过头再看计算器函数,根据以上原理分析,每月的计算如下:
设上期贷款余额a1,本期余额a2,则有:a2=a1(1+r)-b=a1-(b-a1×r),也就是本期还款剔除利息,剩余的就是上期余额扣除部分,
得到本期余额,如此迭代。体现在代码上就是:
    $paymentInterest = round($balance * $monthlyInterest, 2);
    $paymentPrincipal = round($periodicPayment - $paymentInterest, 2);
    $newBalance = round($balance - $paymentPrincipal, 2);

////////////////分期还贷计算器完整代码
<?php

function amortizationTable($pNum, $periodicPayment, $balance, $monthlyInterest)
{
    // Calculate payment interest
    $paymentInterest = round($balance * $monthlyInterest, 2);

    // Calculate payment principal
    $paymentPrincipal = round($periodicPayment - $paymentInterest, 2);

    // Deduct principal from remaining balance
    $newBalance = round($balance - $paymentPrincipal, 2);

    // If new balance < monthly payment, set to zero
    if ($newBalance < $paymentPrincipal) {
        $newBalance = 0;
    }

    printf("<tr><td>%d</td>", $pNum);
    printf("<td>$%s</td>", number_format($newBalance, 2));
    printf("<td>$%s</td>", number_format($periodicPayment, 2));
    printf("<td>$%s</td>", number_format($paymentPrincipal, 2));
    printf("<td>$%s</td></tr>", number_format($paymentInterest, 2));

    # If balance not yet zero, recursively call amortizationTable()
    if ($newBalance > 0) {
         $pNum++;
         amortizationTable($pNum, $periodicPayment,
                            $newBalance, $monthlyInterest);
    } else {
        return 0;
    }

}

   // Loan balance
   $balance = 10000.00;

   // Loan interest rate
   $interestRate = .0575;

   // Monthly interest rate
   $monthlyInterest = $interestRate / 12;

   // Term length of the loan, in years.
   $termLength = 5;

   // Number of payments per year.
   $paymentsPerYear = 12;

   // Payment iteration
   $paymentNumber = 1;

   //还款月数m
   // Determine total number payments
   $totalPayments = $termLength * $paymentsPerYear;

   //复利1+r
   // Determine interest component of periodic payment 
   $intCalc = 1 + $interestRate / $paymentsPerYear;

   //计算月还款额b
   // Determine periodic payment  
   $periodicPayment = $balance * pow($intCalc,$totalPayments) * ($intCalc - 1) /
                                    (pow($intCalc,$totalPayments) - 1);

   // Round periodic payment to two decimals
   $periodicPayment = round($periodicPayment,2);

   // Create table
   echo "<table width='50%' align='center' border='1'>";
   echo "<tr>
         <th>Payment Number</th><th>Balance</th>
         <th>Payment</th><th>Principal</th><th>Interest</th>
         </tr>";

   // Call recursive function
   amortizationTable($paymentNumber, $periodicPayment, $balance,
                     $monthlyInterest);

   // Close table
   echo "</table>";

?>

//////////以上代码贷款1万元5年还清,年息(5.75%),代码运行结果得出的还款逐月情况如下:
Payment Number    Balance    Payment    Principal    Interest
1    $9,855.75    $192.17    $144.25    $47.92
2    $9,710.81    $192.17    $144.94    $47.23
3    $9,565.17    $192.17    $145.64    $46.53
4    $9,418.83    $192.17    $146.34    $45.83
5    $9,271.79    $192.17    $147.04    $45.13
6    $9,124.05    $192.17    $147.74    $44.43
7    $8,975.60    $192.17    $148.45    $43.72
8    $8,826.44    $192.17    $149.16    $43.01
9    $8,676.56    $192.17    $149.88    $42.29
10    $8,525.97    $192.17    $150.59    $41.58
11    $8,374.65    $192.17    $151.32    $40.85
12    $8,222.61    $192.17    $152.04    $40.13
13    $8,069.84    $192.17    $152.77    $39.40
14    $7,916.34    $192.17    $153.50    $38.67
15    $7,762.10    $192.17    $154.24    $37.93
16    $7,607.12    $192.17    $154.98    $37.19
17    $7,451.40    $192.17    $155.72    $36.45
18    $7,294.93    $192.17    $156.47    $35.70
19    $7,137.71    $192.17    $157.22    $34.95
20    $6,979.74    $192.17    $157.97    $34.20
21    $6,821.01    $192.17    $158.73    $33.44
22    $6,661.52    $192.17    $159.49    $32.68
23    $6,501.27    $192.17    $160.25    $31.92
24    $6,340.25    $192.17    $161.02    $31.15
25    $6,178.46    $192.17    $161.79    $30.38
26    $6,015.90    $192.17    $162.56    $29.61
27    $5,852.56    $192.17    $163.34    $28.83
28    $5,688.43    $192.17    $164.13    $28.04
29    $5,523.52    $192.17    $164.91    $27.26
30    $5,357.82    $192.17    $165.70    $26.47
31    $5,191.32    $192.17    $166.50    $25.67
32    $5,024.03    $192.17    $167.29    $24.88
33    $4,855.93    $192.17    $168.10    $24.07
34    $4,687.03    $192.17    $168.90    $23.27
35    $4,517.32    $192.17    $169.71    $22.46
36    $4,346.80    $192.17    $170.52    $21.65
37    $4,175.46    $192.17    $171.34    $20.83
38    $4,003.30    $192.17    $172.16    $20.01
39    $3,830.31    $192.17    $172.99    $19.18
40    $3,656.49    $192.17    $173.82    $18.35
41    $3,481.84    $192.17    $174.65    $17.52
42    $3,306.35    $192.17    $175.49    $16.68
43    $3,130.02    $192.17    $176.33    $15.84
44    $2,952.85    $192.17    $177.17    $15.00
45    $2,774.83    $192.17    $178.02    $14.15
46    $2,595.96    $192.17    $178.87    $13.30
47    $2,416.23    $192.17    $179.73    $12.44
48    $2,235.64    $192.17    $180.59    $11.58
49    $2,054.18    $192.17    $181.46    $10.71
50    $1,871.85    $192.17    $182.33    $9.84
51    $1,688.65    $192.17    $183.20    $8.97
52    $1,504.57    $192.17    $184.08    $8.09
53    $1,319.61    $192.17    $184.96    $7.21
54    $1,133.76    $192.17    $185.85    $6.32
55    $947.02    $192.17    $186.74    $5.43
56    $759.39    $192.17    $187.63    $4.54
57    $570.86    $192.17    $188.53    $3.64
58    $381.43    $192.17    $189.43    $2.74
59    $191.09    $192.17    $190.34    $1.83
60    $0.00    $192.17    $191.25    $0.92
 

热门文章

暂无图片
编程学习 ·

蒙哥马利模乘

Montgomery乘法的数学表达式是A * B * R ^ (-1)mod M。A、B是同位长大数,R是2的M(位长)的次方,R ^ (-1)是指R相对于M的模逆,即R ^ (-1)满足以下条件的数:R * R ^ (-1) mod M = 1;这个条件成立的充要条件是R与M互素,这一点只需要M为奇数即可。 使用蒙哥马利乘法可以做…
暂无图片
编程学习 ·

C语言实现为终端程序--webshell基石

之前对ssh一直很困惑它是如何实现的,网上也没有相关代码实例,所以自己花了一段时间研究了一下。本篇博客主要写了两个程度:服务端和客户端,通过客户端可以远程登录服务端,执行shell命令。代码实现的比较糙,但是基本原理一看就明白。一、主要核心思想:1)创建pty虚拟终端…
暂无图片
编程学习 ·

Java多线程编程复习总结(一)

Java中多线程概述 一、基本概念 进程和线程进程是程序运行的实例,比如Java程序就是一个Java虚拟机进程 每个进程中可以包含多个线程,每个线程完成各自不同的任务,在Java平台中一个线程对应一个对象但是这个对象和普通类中声明的对象不一样,不是分配在对空间中的;而是,JVM…
暂无图片
编程学习 ·

自增自减及逗号表达式

** 自增自减及逗号表达式 **一.自增、自减运算符1.自增运算符++和自减运算符–都是单目运算符,功能是使变量的值加1或减1。 2.自加或自减只能用于变量,而不能用于常量或表达式。 3.用于++、–运算的变量只能是整型、字符型和指针型变量运行下面的程序,观察并分析运算规则#in…
暂无图片
编程学习 ·

Matlab class文件 简单上手使用

1.简单的书写规范 一般通过软件(拓展)新建功能,可以选择新建一个脚本、函数或者是类。当然文件中以类的形式书写代码,保存后matlab将自动识别该文件为类。 当使用软件新建类后,新建的文件中包含了类文件的基础格式(我使用的软件是MATLAB R2014b): classdef Untitled3%U…
暂无图片
编程学习 ·

springboot静态资源无法加载最后原因竟然是拦截器没有生效

今天打开项目,发现页面的样式没了,用F12调试,果不其然,css,js等样式没有加载成功 后面看控制台发现报 No mapping for GET 静态资源。 很明显,访问静态资源的请求被springboot拦截了。 然后我又看自己写的拦截器 @Overridepublic void addInterceptors(InterceptorRegist…
暂无图片
编程学习 ·

Java之父 詹姆斯·高斯林 传奇的一生

Java之父 传奇的一生 Java之父 詹姆斯高斯林 詹姆斯高斯林 (James Gosling)是一名软件专家,1955年5月19日出生于加拿大,Java编程语言的共同创始人之一,一般公认他为“Java之父”。 1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算…
暂无图片
编程学习 ·

Java学习篇2_入门程序说明、注释、关键字、标识符

上一篇博客:JDK、JRE、JVM三者之间的联系目录 关于一些小补充 入门程序说明 注释 关键字 标识符命名规则 命名规范开始一、关于一些小补充 Java语言的发展历史1995年Sun公司发布Java1.0版本 1997年发布Java 1.1版本 1998年发布Java 1.2版本 2000年发布Java 1.3版本 2002年发布…
暂无图片
编程学习 ·

LeetCode 237. 删除链表中的节点

目录结构1.题目2.题解1.题目请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。现有一个链表 -- head = [4,5,1,9],它可以表示为:示例:输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那…
暂无图片
编程学习 ·

文字后面显示展开或者收取

文字后面显示展开或者收取 在文字显示时,可能有这样的要求,例如,限制文字为3行,超过3行后,在文字最后显示"查看更多" 在网络上搜索了下,有如下的几种方式来实现: 1.开源控件,使用TruncationTokenYYLabel 点击展开和收起全文 展开label,利用YYText实现文字显…
暂无图片
编程学习 ·

「清华」区块链工程师大讲堂之区块链基础-公益活动

背景 十三五规划明确区块链作为新一代核心技术以后,区块链上升为国家战略,22省市将区块链写入政府工作报告,2019年"1024"政治局全体学习明确发展方向。此外,2019年中国市场区块链相关企业总量为36224家,各大互联网科技公司都在积极布局区块链。各行各业对于区块…
暂无图片
编程学习 ·

创建型——工厂系列(Factory)day04

任何可以产生对象的方法或类,都可以称为工厂 单例也是一种工厂 为什么有了new以后,还要有工厂? 1、灵活控制生产过程 2、权限、修饰、日志……接口模式package cn.xhl.interfacemodel;public interface IFruit {public void plant();public void harvest();public void grow…