数学公式的问题 - Java

3
我正在为我的Java课程制作一个程序,它可以计算从起始年份(2011年)开始每年增长1.2%的人口数量。2011年的人口为7,000(我使用小数,而不是十亿)。我目前有这段代码。
int startYear = 2011;
int endYear = user_input.nextInt();
double t = 1.2; //Population percent increase anually
double nbr = (endYear - startYear); //Number of years increased
double pStart = 7.000; //Starting population of 2011
double pEnd = pStart * Math.exp(nbr * t); // Ending population of user input
DecimalFormat nf = new DecimalFormat("2");
System.out.println("Population in " + endYear + ": " (nf.format(pEnd)));

代码没有错误,一切都可以运作,但是我在pEnd方程上遇到了麻烦。当前,当我输入2016作为结束年份时,我得到22824的结果。我尝试过在Google上搜索公式,但是我找不到任何有用的内容。你们中的任何人有这个公式的想法吗?如果你输入2016作为结束年份,它应该大约是7.433


你的数学公式是什么?是pStart x e^(nbr x t)吗? - Infamous
exp(double a):返回以双精度值a为底数的自然指数e的幂次方结果。 您确定这是您想要的吗? - tkausl
我不确定我理解这个公式,但这是我得到的。 - Meme Boi
3个回答

2
您正在以1.2的倍数递增,这代表着120%而不是1.2%。我认为您想要的应该是:
double t = 0.012;

这个改变让我从2011年到2016年得到了一个精确值为7.4328558258175175。
编辑:以下是作者要求的代码:
public static void main(String args[]){
    int startYear = 2011;
    int endYear = 2016;
    double t = 0.012; //Population percent increase anually
    double nbr = (endYear - startYear); //Number of years increased
    double pStart = 7.000; //Starting population of 2011
    double pEnd = pStart * Math.exp(nbr * t); // Ending population of user input
    System.out.println("Population in " + endYear + ": " + pEnd);
}

由于某种原因,当我输入2016时,我得到了7.136506736265682,一切似乎都正确,所以我不确定为什么会这样。我能看看你的代码吗? - Meme Boi
谢谢!不确定我的哪里出了问题,因为它们是一样的,但当我复制你的时候它就可以工作了。 - Meme Boi

1
使用Math.pow(1 + t / 100, nbr)代替Math.exp(nbr * t),因为你需要(1+t/100)^nbr(即将1 + t / 100乘以自身nbr次方),而不是exp^(nbr*t)
double pEnd = pStart * Math.pow(1 + t / 100, nbr); // Ending population of user input

当我输入那个时,它给了我248,我还漏掉了什么吗? - Meme Boi
@MemeBoi,是的,我在我的回答中添加了。 - Filipp Voronov
是的,需要等待2分钟才能做到这一点。 - Meme Boi
使用Math.exp本身并没有问题——问题在于利率的值(1.2与0.012)之间的差异。 - assylias
@assylias,为什么?他需要对比率(1.012)进行幂运算。要使用“exp”,他需要获取比率的“ln”。 - Filipp Voronov
@PhilipVoronov 指数形式通常用于连续复利,而幂形式用于离散复利。在这个例子中,连续复利更有意义。另外请注意,对于小的 t 值,exp(nbrt*t) 和 (1+t)^nbr 大约相等。 - assylias

0

试试这个。

double pEnd = pStart * Math.pow(1.0 + t / 100, nbr);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接