我正在进行一项CS任务,我很难理解如何在给定用户指定的增长率的情况下以一定的时间增量输出代表银行账户中的金额的双打数组。我有一个主要的方法,要求用户初始安装$,一个growthRate和时间间隔的数量(表示为初始金额,增长率和期间数的iA,gR和nP)。然后,此方法调用另一个返回类型为double []的方法。我的问题是我的for循环中的代码,它编译得很好,但输出乱码。继承人代码:
import java.util.Scanner;
public class Benford {
public static double[] generateBenfordNumbers (double iA, double gR, int nP) {
double[] bankStatement = new double[nP];
for (int i = 0; i<nP; i++) {
bankStatement[i] = (iA*(Math.pow((1+(gR)), (i++))));
}
return bankStatement;
}
public static void main (String[] args) {
Scanner scan = new Scanner(System.in);
double iA;
double gR;
int nP;
System.out.print("What is the initial amount of money that you are starting with? : ");
iA = scan.nextDouble();
System.out.println();
System.out.print("What is the amount of growth per time period? : ");
gR = scan.nextDouble();
System.out.println();
System.out.print("How many time periods would you like to use? : ");
nP = scan.nextInt();
System.out.println();
generateBenfordNumbers(iA, gR, nP);
System.out.print(generateBenfordNumbers(iA, gR, nP));
}
}
答案 0 :(得分:2)
在第
行bankStatement[i] = (iA*(Math.pow((1+(gR)), (i++))));
i++
第二次递增i
。你可能想要:
bankStatement[i] = (iA*(Math.pow((1+(gR)), i + 1)));
或者,如果我们清理它,
bankStatement[i] = iA * Math.pow(1 + gR, i + 1);
i + 1
返回的值大于i
的值,但实际上并没有增加变量本身。
另外,你真的每次都要使用Math.pow
吗?你不能手动将数组的第一个元素设置为iA
,然后使用bankStatement[i-1]
来计算bankStatement[i]
吗?做这样的事情可能会改善你的计划。
答案 1 :(得分:1)
i增加两次:在循环级别并进入正文
答案 2 :(得分:1)
乱码输出如下:
[D@1b67f74
是双数组文本表示。你可以使用:
System.out.print(Arrays.toString(generateBenfordNumbers(iA, gR, nP)));
答案 3 :(得分:0)
你不应该在调用Math.pow时增加我。这是因为你已经在for循环中增加了它。结果是数组的元素被跳过而没有设置。这可能就是胡言乱语的来源。
您可能想要更改:
bankStatement[i] = (iA*(Math.pow((1+(gR)), (i++))));
要:
bankStatement[i] = iA*Math.pow(1+gR, i);
另外,顺便说一句,你通常不应该使用这么多括号,因为它很难阅读。如果您不确定操作顺序是什么,look it up。
答案 4 :(得分:0)
其他人说的话,你们两次递增,所以我不打算再重复一遍。我只想补充一点,括号可以很好地组织公式并确保正确的计算执行顺序,但是如果你过度使用它们,它们可能会混淆你的程序的意图,它们可能会使你正在寻找更难找到的问题。比较
bankStatement[i] = iA * Math.pow(1.0 + gR, i+1);
与
bankStatement[i] = (iA*(Math.pow((1+(gR)), (i))));
明白我的意思?
编辑 - 跟随ARS关于i的初始值的非常有效的评论,我更改了清理的声明。