Java 获得';无穷大';输出而不是实际数字

Java 获得';无穷大';输出而不是实际数字,java,math,infinity,Java,Math,Infinity,我正在练习一些Java,我正在编写的一个应用程序要求在未来75年内输出世界人口 我使用的是人口增长模型。我的问题是,我的应用程序在应该输出估计总体的列中输出“无穷大” 这是我的代码: import java.util.Calendar; import java.util.regex.Matcher; public class WorldPopulationGrowth { public static void main(String[] args) { double c

我正在练习一些Java,我正在编写的一个应用程序要求在未来75年内输出世界人口

我使用的是人口增长模型。我的问题是,我的应用程序在应该输出估计总体的列中输出“无穷大”

这是我的代码:

import java.util.Calendar;
import java.util.regex.Matcher;

public class WorldPopulationGrowth {
    public static void main(String[] args) {
        double currentWorldPopulation = 7.4e9;
        double worldPopulationGrowthRate = 1.13;
        double anticipatedWorldPopulation;
        int initialYear = Calendar.getInstance().get(Calendar.YEAR);

        System.out.println("Year\tAnticipated World Population (in billions)\tPopulation " +
                "increase since last year");
        System.out.println(String.format("%d\t%.1e\t\t\t\t\t\t\t\t\t\t\tNA", initialYear, currentWorldPopulation) );


        for(int i=1; i < 76; i++){
            int year = initialYear + i;
            double growthExponential = worldPopulationGrowthRate*year*1.0;
            anticipatedWorldPopulation =  currentWorldPopulation * Math.pow(Math.E, growthExponential);

            System.out.println(String.format("%d\t%.1e\t\t\t\t\t\t\t\t\t\t\t", year, anticipatedWorldPopulation));

            currentWorldPopulation = anticipatedWorldPopulation;
        }

    }
}
import java.util.Calendar;
导入java.util.regex.Matcher;
公共阶层世界人口增长{
公共静态void main(字符串[]args){
双电流世界人口=7.4e9;
双世界人口增长率=1.13;
双重预期世界人口;
int initialYear=Calendar.getInstance().get(Calendar.YEAR);
System.out.println(“年\预计世界人口(十亿)\t人口”+
“自去年以来的增长”);
System.out.println(String.format(“%d\t%.1e\t\t\t\t\t\t\t\t\tNA”,initialYear,currentWorldPopulation));
对于(int i=1;i<76;i++){
int year=初始年份+i;
双增长指数=世界人口增长率*年*1.0;
预期世界人口=当前世界人口*Math.pow(Math.E,growthExponential);
System.out.println(String.format(“%d\t%.1e\t\t\t\t\t\t\t\t\t”,年份,预期世界人口));
当前世界人口=预期世界人口;
}
}
}

@Krease发现了您的问题

我重新编码了。一旦你解决了这个问题,他就发现没问题了。我使用JDK 8 lambdas,并给出了百分比和指数增长模型。代码将打印这两个文件以进行比较:

import java.util.function.DoubleFunction;


/**
 * Simplistic population growth model
 * @link  https://stackoverflow.com/questions/38805318/getting-infinity-output-instead-of-actual-numbers/38805409?noredirect=1#comment64979614_38805409
 */
public class WorldPopulationGrowth {

    public static void main(String[] args) {
        double currentWorldPopulation = 7.4e9;
        double worldPopulationGrowthRate = 1.13;
        int numYears = 76;
        int startYear = 1976;

        double populationExponential = currentWorldPopulation;
        ExponentialGrowthModel modelExpGrowth = new ExponentialGrowthModel(worldPopulationGrowthRate);
        double populationPercentage = currentWorldPopulation;
        PercentageGrowthModel modelPercentGrowth = new PercentageGrowthModel(worldPopulationGrowthRate);

        System.out.println(String.format("%10s %20.3e %20.3e", startYear, currentWorldPopulation, currentWorldPopulation));
        for (int i = 1; i < numYears; ++i) {
            populationExponential = modelExpGrowth.apply(populationExponential);
            populationPercentage = modelPercentGrowth.apply(populationPercentage);
            System.out.println(String.format("%10s %20.3e %20.3e", startYear+i, populationExponential, populationPercentage));
        }
    }
}

class ExponentialGrowthModel implements DoubleFunction<Double> {

    private double exponent;

    ExponentialGrowthModel(double exponent) {
        this.exponent = exponent;
    }

    private double getExponent() {
        return exponent;
    }

    public void setExponent(double exponent) {
        this.exponent = exponent;
    }

    @Override
    public Double apply(double value) {
        return value*Math.exp(this.getExponent());
    }
}

class PercentageGrowthModel implements DoubleFunction<Double> {

    private double percentageIncrease;

    PercentageGrowthModel(double percentageIncrease) {
        this.percentageIncrease = percentageIncrease;
    }

    private double getPercentageIncrease() {
        return percentageIncrease;
    }

    public void setPercentageIncrease(double percentageIncrease) {
        this.percentageIncrease = percentageIncrease;
    }

    @Override
    public Double apply(double value) {
        return value*(this.getPercentageIncrease());
    }
}
import java.util.function.DoubleFunction;
/**
*简单人口增长模型
*@linkhttps://stackoverflow.com/questions/38805318/getting-infinity-output-instead-of-actual-numbers/38805409?noredirect=1#comment64979614_38805409
*/
公共阶层世界人口增长{
公共静态void main(字符串[]args){
双电流世界人口=7.4e9;
双世界人口增长率=1.13;
int numYears=76;
int startYear=1976;
双种群指数=当前世界种群;
指数增长模型expgrowth=新指数增长模型(worldPopulationGrowthRate);
double populationPercentage=当前世界人口;
PercentageGrowthModel Percentgrowth=新的PercentageGrowthModel(世界人口增长率);
System.out.println(String.format(“%10s%20.3e%20.3e”,startYear,currentWorldPopulation,currentWorldPopulation));
对于(int i=1;i
让我们仔细看看您的代码的第一次迭代,就好像我们正在调试它一样(请确保以后尝试这样做!)

  • currentWorldPopulation
    =7.4e9
  • worldPopulationGrowthRate
    为1.13
  • initialYear
    是2016年
  • 循环开始时,
    i
    为1
    • 年份
      设置为2017年
    • growthExponential
      设置为1.13*2017=2279.21(这是问题的开始)
    • ExpectedWorldPopulation
      设置为7.4e9*e^2279.21
    • 这大约是7.4e9*7.05e989。。。卡布姆

重新检查您的计算,并逐步检查您的应用程序(最好是在调试器中)以查看您的问题。

您是否尝试过对其进行调试?你的
growth指数
将乘以当前年份,每次迭代,这肯定会抛开你的数学你似乎还用
math.E做了其他不正确的事情,它本身将几乎是当前人口
每次迭代的三倍,但是你每次都会把它提高到几千次方。增长应该是通过公式
pow(GrowthRate,i)
exp(log(GrowthRate)*i)
。数学上的误差甚至更大;)看我对这个问题的评论。现在我正在更仔细地阅读代码,我可以看出你是对的。OP混淆了功率模型和致命影响的年度百分比增长。这是正确的答案。我建议OP接受并投票表决这个。“好眼力,@kreasethance,把它弄清楚了。我使用的是1.13%的增长率,而不是正确的0.0113。我用计数器I代替年份。如果我有足够的声誉,我会提高投票率!:)