二分搜索求利率近似解

问题背景:零存整取的保险利率求解

问题假设:因为不清楚真实的保险金额计算过程,所以假定为每年存入一定金额everyyear,在连续购买nbought年之后,再保障nwork-nbought年。在nwork年之内对被保险人有保障,(nbought<=nwork)。nwork年之后返还总金额totalmoney。

现在已知,nwork年后保险的返还总金额totalmoney和上述变量值,求解年化利率(当年的本金为上一年度本金与利息之和)。

问题求解:当然是二分查找了,在某一个给定的区间去搜索一个符合精度要求的利率,复杂度为O(log2(n))。


代码中的数据都是真实值,起初看到总的回报率超过了200%,我以为这真的是搞金融的良心发现了。得到计算结果后,我的心凉了一半,因为模拟得到的年化利率只有20%多,并不是非常高。况且考虑到货币贬值的影响,这种投资连抵消通货膨胀的作用都没有达到。

心塞~想去做金融

public class Main{
	public static void main(String args[]){
		double everyyear=480;
		double totalmoney=20000;
		int nbought=16;
		int nwork=20;
		double lilv=computelilv(everyyear,totalmoney,nbought,nwork);
		System.out.println("年化:"+lilv);
	}
	static double computelilv(double everyyear,double totalmoney,int nbought,int nwork)
	{
		Double lixi=0.0;	//初始的利息与本金和为零
		Double lilv=0.5;	//初始年化利率为0.5
		double lowlimit=0,highlimit=1;	//利率上下界
		do{
			lixi=0.0;
			for(int i=0;i<nbought;i++){
				lixi+=(lixi+everyyear)*lilv;
			}//在购买年限内,每年都投入本金,以复利方式计算利息
			for(int i=0;i<(nwork-nbought);i++){
				lixi+=lixi*lilv;
			}//在保障年限内,不追加本金,复利计算利息
			System.out.printf("%f %.8f\n", lixi,lilv);
			
			if(lixi>totalmoney){
				//根据二分法调整利率
				highlimit=lilv;
				lilv=(highlimit+lowlimit)/2;
			}else{
				lowlimit=lilv;
				lilv=(highlimit+lowlimit)/2;
			}
		}while(Math.abs(lixi-totalmoney)>0.01);
		//当真实的总金额与以猜测的利率生成的总金额的绝对差小于阈值时,停止迭代
		return lilv;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值