这是我的代码:
private void btnCalculateActionPerformed(java.awt.event.ActionEvent evt) {
int intInitialInvest = Integer.parseInt(this.txtInputInitialInvest.getText());
int intAnnualInterest = Integer.parseInt(this.txtInputAnnualInterest.getText());
int intEndingValue = Integer.parseInt(this.txtInputEndingValue.getText());
double dblAnnualPercent = intAnnualInterest/100;
int count = 0;
while (intInitialInvest < intEndingValue){
intInitialInvest += (intInitialInvest * dblAnnualPercent);
count += 1;
}
this.lblOutputYears.setText("The number of years required is " + count);
}
该程序应该计算多少年(count
),例如价值2000美元的CD变为5000美元,年利率为8%。这应该返回12.我所做的是创建一个while循环,直到2000美元变成$ 5000或更多的兴趣,由intInitialinvest += (intInitialInvest * dblAnnualPercent);
表示
每次我通过点击&#34;计算&#34;来运行程序按钮,程序冻结,什么都不做,然后我必须进入任务管理器关闭它。
答案 0 :(得分:0)
如果intInitialInvest=0
或dblAnnualPercent=0
和intEndingValue > 0
您将永远循环。
while (intInitialInvest < intEndingValue){
intInitialInvest += (intInitialInvest * dblAnnualPercent);
count += 1;
}
您必须在进入循环之前测试您的值,尤其是当您似乎从某些输入中读取这些值时。这是一种可能的攻击媒介,即使您对这些值进行断言,当您的算法中断时,有人提供的输入会生成intInitialInvest=0
或intAnnualInterest<100
。
答案 1 :(得分:0)
小心整数除法:
double dblAnnualPercent = intAnnualInterest/100;
导致dblAnnualPercent
的值为0.0
,因此您会遇到无限循环。您执行整数除法(例如8/100=0
)然后转换为双倍(0.0
,而不是0.05
,如您所料。)
double dblAnnualPercent = intAnnualInterest/100.;
应该修复你的错误。
提示:添加断言,在启用断言的情况下运行您的问题。
assert(dblAnnualPercent > 0.);
可以保存您(假设您使用-ea
运行程序。)
但也尝试在没有循环的情况下解决您的问题。有一个封闭形式的解决方案,使用数学而不是循环...该解决方案仅一行。