• 分期付款中的利率问题


    最近贷款买了一件商品,贷款前商家说年利率只要 3.11%,看着确实挺低的,但后面发现由于是分期,综合年利率其实并不低。
    买的这件商品共分 36期,每期偿还相等的金额,即:假设贷款金额是 A A A 元,每期应偿还:
    A + A ∗ 0.0311 ∗ 3 36 \frac{A+A*0.0311*3}{36} 36A+A0.03113那么请问综合年利率大概是多少?下面就尝试算一算。
    假设,贷款金额为 A A A 元,综合年利率为 x x x,第 i i i 期偿还的金额为: y y y(每期等额),其中本金为: w ( i ) w(i) w(i),利息为: v ( i ) v(i) v(i),则有以下几个等式:
    y = A + A ∗ 0.0311 ∗ 3 36 (1) \tag{1} y = \frac{A+A*0.0311*3}{36} y=36A+A0.03113(1)
    y = w ( i ) + v ( i ) (2) \tag{2} y = w(i) + v(i) y=w(i)+v(i)(2)
    v ( i ) = ( A − ∑ j = 1 i − 1 w ( j ) ) ∗ x 12 (3) \tag{3} v(i) = (A-\sum_{j=1}^{i-1}w(j)) * \frac{x}{12} v(i)=(Aj=1i1w(j))12x(3)
    ∑ i = 1 36 v ( i ) = A ∗ 0.0311 ∗ 3 (4) \tag{4}\sum_{i=1}^{36}v(i) = A * 0.0311 * 3 i=136v(i)=A0.03113(4)

    已知上述 4个等式,求: x x x

    数学功底比较差,虽然列出式子,但不知道如何计算 😦 。只能手动编写以下程序求 ( 3 ) (3) (3) 式中的 x x x,基本原理是:假设综合年利率在 0.0311(商家说的年利率)到 0.1(估计不会超过 10%)之间,那么可以从 [0.0311, 0.1]之间均匀选取 1000个点,再从这 1000个点中选取一个使 ( 4 ) (4) (4) 式左右两端误差最小的 x x x 值。仔细观察上面几个式子,可以发现在 ( 4 ) (4) (4) 式展开后,等式两端可以同时约掉贷款本金,也就是说,贷款本金与综合年利率没有关系,下面代码中假设贷款本金为 100000。代码如下所示:

    #include 
    
    #define A 100000
    #define CANDIDATE_MAX_NUM 1000
    
    struct candidate {
    	double rate;
    	double result;
    	double diff;
    };
    
    double abs_double(double num)
    {
    	return num >= 0 ? num : -num;
    }
    
    double v_sum(double rate)
    {
    	double y = (A + A * 0.0311 * 3) / 36;
    	double vi, wi, w_sum = 0, _v_sum = 0;
    	int i = 0;
    
    	for (i = 1; i <= 36; ++i) {
    		vi = (A - w_sum) * rate * 1 / 12;
    		wi = y - vi;
    		w_sum += wi;
    		_v_sum += vi;
    	}
    
    	return _v_sum;
    }
    
    void calc(void)
    {
    	double min = 0.0311;
    	double max = 0.1000;
    	double step = (max - min) / CANDIDATE_MAX_NUM;
    	double r = min;
    	struct candidate cand = {0, 0, 0};
    	double target = A * 0.0311 * 3;
    	double result, diff;
    	int i = 0;
    
    	for (i = 0; i < CANDIDATE_MAX_NUM; ++i) {
    		result = v_sum(r);
    		diff = abs_double(result - target);
    		if (i == 0 || diff < cand.diff) {
    			cand.rate = r;
    			cand.result = result;
    			cand.diff = diff;
    		}
    		r += step;
    	}
    
    	printf("rate = %lf, result = %lf, target = %lf, diff = %lf\n",
    		cand.rate, cand.result, target, cand.diff);
    }
    
    int main(void)
    {
    	calc();
    
    	return 0;
    }
    
    • 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

    程序运行结果如下:

    [zhoumin@localhost]$ ./main 
    rate = 0.058867, result = 9334.592459, target = 9330.000000, diff = 4.592459
    
    • 1
    • 2

    由上面的运行结果可知,计算出的综合年利率 x x x5.88%,比商家所说的年利率高了不少,这样来看,分期付款的综合年利率其实并不低。

  • 相关阅读:
    MySQL之数据库三大范式
    JavaWeb Day05 前后端请求响应与分层解耦
    都说 C++ 没有 GC,RAII: 那么我算个啥?
    KingbaseES客户端编程接口指南-ODBC(4. 创建数据源)
    从0到1搭建推荐系统
    Flutter ーー logger 组件记录日志
    在 Apache Kafka 中通过死信队列进行错误处理
    【MySQL数据库】| 索引以及背后的数据结构
    playwright: local variable ‘page‘ referenced before assignment
    【车载开发系列】汽车嵌入式开发常用工具介绍
  • 原文地址:https://blog.csdn.net/choumin/article/details/125884555