Java 获得';无穷大';输出而不是实际数字
我正在练习一些Java,我正在编写的一个应用程序要求在未来75年内输出世界人口 我使用的是人口增长模型。我的问题是,我的应用程序在应该输出估计总体的列中输出“无穷大” 这是我的代码: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
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
让我们仔细看看您的代码的第一次迭代,就好像我们正在调试它一样(请确保以后尝试这样做!)
=7.4e9currentWorldPopulation
为1.13worldPopulationGrowthRate
是2016年initialYear
- 循环开始时,
为1i
设置为2017年年份
设置为1.13*2017=2279.21(这是问题的开始)growthExponential
设置为7.4e9*e^2279.21ExpectedWorldPopulation
- 这大约是7.4e9*7.05e989。。。卡布姆
重新检查您的计算,并逐步检查您的应用程序(最好是在调试器中)以查看您的问题。您是否尝试过对其进行调试?你的
growth指数
将乘以当前年份,每次迭代,这肯定会抛开你的数学你似乎还用math.E做了其他不正确的事情,它本身将几乎是当前人口
每次迭代的三倍,但是你每次都会把它提高到几千次方。增长应该是通过公式pow(GrowthRate,i)
或exp(log(GrowthRate)*i)
。数学上的误差甚至更大;)看我对这个问题的评论。现在我正在更仔细地阅读代码,我可以看出你是对的。OP混淆了功率模型和致命影响的年度百分比增长。这是正确的答案。我建议OP接受并投票表决这个。“好眼力,@kreasethance,把它弄清楚了。我使用的是1.13%的增长率,而不是正确的0.0113。我用计数器I代替年份。如果我有足够的声誉,我会提高投票率!:)