问题背景:零存整取的保险利率求解
问题假设:因为不清楚真实的保险金额计算过程,所以假定为每年存入一定金额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;
}
}