1

我正在处理一项 CS 任务,但我在理解如何在给定用户指定的增长率的情况下以时间增量输出代表银行账户中货币数量的双精度数组时遇到了一些麻烦。我有一个主要方法,它要求用户提供 $ 的初始金额、增长率和时间间隔数(表示初始金额、增长率和周期数的 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));
    }
}
4

5 回答 5

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返回一个大于 的值 1 i,但实际上并不增加变量本身。


还有,你真的Math.pow每次都要用吗?您不能手动将数组的第一个元素设置为iA并随后用于bankStatement[i-1]计算bankStatement[i]吗?做这样的事情可能会改善你的程序。

于 2012-10-08T22:23:53.140 回答
1

i 递增两次:在循环级别并进入正文

于 2012-10-08T22:22:07.973 回答
1

乱码输出如下所示:

[D@1b67f74

这是双数组文本表示。你可以使用:

System.out.print(Arrays.toString(generateBenfordNumbers(iA, gR, nP)));
于 2012-10-08T22:25:51.047 回答
0

您不应该在对 Math.pow 的调用中增加 i。这是因为您已经在 for 循环中增加了它。结果是您的数组元素被跳过而不是设置。这可能是胡言乱语的来源。

您可能想要更改:

bankStatement[i] = (iA*(Math.pow((1+(gR)), (i++))));

到:

bankStatement[i] = iA*Math.pow(1+gR, i);

另外,顺便说一句,您通常不应该使用这么多括号,因为这会使阅读变得困难。如果您不确定操作的顺序是什么,请查一下

于 2012-10-08T22:24:37.957 回答
0

其他人所说的,您将 i 增加两次,所以我不会重复。我只想补充一点,括号可以很好地组织公式并确保计算的正确执行顺序,但是如果您过度使用它们,它们可能会混淆您的程序的意图,并且它们可能会使您正在寻找的问题更难发现。比较

bankStatement[i] = iA * Math.pow(1.0 + gR, i+1);

bankStatement[i] = (iA*(Math.pow((1+(gR)), (i))));

明白了吗?

编辑 - 在 ARS 关于 i 的初始值的非常有效的评论之后,我更改了清理后的语句。

于 2012-10-08T22:33:02.497 回答