【问题标题】:exponential growth in java, return type array of doublesjava中的指数增长,返回类型的双精度数组
【发布时间】:2012-10-08 22:19:14
【问题描述】:

我正在处理一项 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));
    }
}

【问题讨论】:

  • 乱码输出是什么意思?究竟是什么让您感到不安?

标签: java arrays for-loop exponential


【解决方案1】:

排队

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 的值 1,但实际上并不增加变量本身。


另外,你真的必须每次都使用Math.pow吗?您不能手动将数组的第一个元素设置为iA,然后使用bankStatement[i-1] 计算bankStatement[i]?这样做可能会改进您的程序。

【讨论】:

  • 谢谢大家,成功了,唯一的问题是当我使用一个简单的例子时:iA=100, gR=.10, nP= 不管什么,我得到 [100.0, 110.00000000001, 121.00000000001 等,只是想弄清楚为什么我最后会得到这些微小的分数。再次感谢!
  • @user1730099 看看this
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    乱码输出如下所示:

    [D@1b67f74
    

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

    System.out.print(Arrays.toString(generateBenfordNumbers(iA, gR, nP)));
    

    【讨论】:

      【解决方案4】:

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

      你可能想要改变:

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

      收件人:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        明白我的意思吗?

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-21
          • 2011-06-11
          • 1970-01-01
          • 2015-02-20
          相关资源
          最近更新 更多