/*
需求:
假设你自己存钱养老,每年存9600元到银行,利率5%.
1.计算从30岁(年初)开始存钱,到65岁退休开始取钱养老,按交了35年,那么到你退休的时候,
你在银行存款的余额一共有多少(本利和,复利)?
2.假设一:从65岁开始取钱(钱被取出之前是存在银行里,也要算利息的),假设你活到80岁.
每年从银行取等额的钱,平均每年能拿多少养老金?
3.假设二:从65岁开始每年平均取6万,总共可以取到多少岁?
*/
class Test
{
public static double getSumMoney(double x30,double r,int from,int to)
{
//x31=x30*(1+r)+x30;x32=x31*(1+r)+x30;......xk+1=xk-1*(1+r)+x30;
//其中x30表示每年存入的钱数;r表示利率;from表示从多少岁存的,to表示存到多少岁
double xk=x30;
for(int i=from;i<to;i++)
xk=xk*(1+r)+x30;
return xk;
}
public static double getFuli(double x30,double r,int from,int to)
{
return getSumMoney(x30,r,from,to)-(to-from)*x30;
}
public static double getBenli(double x30,double r,int from,int to)
{
//第一年存的钱产生的利息是x30*r*35(第一年存入的钱共存了多少年);
//第二年存的钱产生的利息是x30*r*34(第二年存入的钱共存了多少年);
//....将这些年产生的利息累加就是本利
double lixi=0;
for(int i=to;i>from;i--)
{
lixi=lixi+x30*r*(i-from);
}
return lixi;
}
public static double getEveryMoney(double x64,double r,int from,int to)
{
//x65=x64(1+r)+b;x66=x65(1+r)+b;......最后模型的解是x80=(x64+b/r)(1+r)^(to-from)-b/r;
//令x80=0;解出b=(r*x64*(1+r)^(t0-from))/(1-(1+r)^(t0-from));由于是取出钱,所以b为负数,取绝对值就是取出多少钱。
return Math.abs((r*x64*Math.pow(1+r,to-from))/(1-Math.pow(1+r,to-from)));
}
public static int getYear(double x64,double r,double b)
{
//x65=x64(1+r)-b;x66=x65(1+r)-b;....其中b为每年取出的钱数;
//当xn最后小于等于0时说明不能取钱了
double xk=x64;
int count=64;
while(xk>0)
{
xk=xk*(1+r)-b;//下一年剩的钱数
count++;
}
return count;
}
public static void main(String[] args)
{
double fuli=getFuli(9600,0.05,30,65);
System.out.println("复利: "+fuli);
double benli=getBenli(9600,0.05,30,65);
System.out.println("本利: "+benli);
double b=getEveryMoney(getSumMoney(9600,0.05,30,65),0.05,65,80);
System.out.println("每年取出:"+b);
int year=getYear(getSumMoney(9600,0.05,30,65),0.05,60000);
System.out.println("共取到:"+year);
}
}
|