如何编写年度计算复利的方法?

时间:2011-10-27 00:07:49

标签: java

public class Balance {
public static void main(String[] args) {
    System.out.printf("%.2f\n", balance(0.0, 0.0, 0.0));
}
/**
 * @param principal
 * @param rate
 * @param years
 * @return
 */
public static double balance(double principal, double rate, double years) {
    double amount = 0;
    Scanner sc = new Scanner(System.in);

    System.out.print("Enter the initial investment amount: ");
    principal = sc.nextDouble();

    System.out.print("Enter the interest rate: ");
    rate = sc.nextDouble();

    System.out.print("Enter the number of years: ");
    years = sc.nextDouble();

    for (int i = 1; i < years; i++) {
        amount = principal * Math.pow(1.0 + rate, years);
        amount += principal;
    }
    return amount - principal;

}
}

我的问题在于我在main方法中使用的printf行。 Eclipse希望我将方法平衡从void更改为Object []。当我这样做时,我必须从余额中返回一个值。所以我想我的问题是,我将如何返回正确的值?我是在正确的轨道上吗?感谢您的时间和建设性的批评。 :)

编辑 - 感谢大家的帮助,非常感谢:)我的数学已关闭。我的结果比我应该拥有的多1000个。嗯。

所以我应该从这样的数量中拿出1000:

return amount - 1000;

或者这个:

return amount - principal;

编辑这就是我今晚要去的地方。感谢大家的帮助。 :)

4 个答案:

答案 0 :(得分:5)

几点:

  • balance()不能为空,因为您在S.out.printf()中使用其返回值。你想要平衡打印到屏幕上,还是想让它产生一个数字?

  • 您的循环for (years = 0; years > 10; years++)将无法运行。想想为什么。将for转换为while可能会有所帮助,以便可视化原因。

  • 您在几年内读作double,但在循环中将其用作计数器。它究竟应该是什么类型的?

  • 您的balance()函数有三个参数,然后立即获取输入并删除它们。您希望为这些号码提供balance(),还是希望它们提取?

否则,你似乎走在了正确的轨道上。

答案 1 :(得分:4)

问题是balance没有返回任何内容,(它是void函数)。将其更改为:

public static double balance(double principal, double rate, double years) {
...

在该功能中,return余额。

Java告诉你它需要Object[],因为printf的定义如下:

public static void printf(String format, Object ... params) {
    // params is an Object[]
}

这让你做的是传递这样的参数:

printf("some string", first, second, etc);

它允许您传递任意数量的参数,并且该函数可以像处理数组一样处理它们。

它的定义完全相同:

public static void printf(String format, Object[] params);

你用它就是这样:

printf("some string", new Object[] { first, second, etc});

它更容易使用。

编辑:

另一种选择是不在main中打印任何内容,但我肯定会建议返回结果并将其打印在main中。这遵循使每个功能尽可能少的原则。 balance应该只计算余额。打印它是无关的。

答案 2 :(得分:3)

请考虑更严格地重新编写代码;实际上,您的balance()函数正在所有您的程序的工作(并且您的printf()行感觉就像是事后的想法)。如果你根据代码的作用分解你的代码,我认为你可以做得更好:

  • 创建一个提示用户然后读入输入的功能
  • 创建一个函数,为主体,速率和年份调用前一个函数三次
  • 创建一个计算和填充付款计划的功能。跟踪年度,余额,付款,本金和利息支付。 (或者只是你感兴趣的变量 - 但要注意程序往往会增加新功能,而这些变量通常是用户(或教授)在付款时要求知道的第二个事物贷款。)
  • 创建一个功能,用于打印付款计划中的选定列。
  • 创建一个协调以前功能的函数。

当您在三周内重新编写程序以使用GUI或Web服务时,您肯定会感谢您编写了每个函数来执行一个任务,并且做得很好。您还会发现测试只执行一项任务的较小代码片段要容易得多。

存在 over engineering 过于通用的解决方案的风险 - 我真正想要建议的是将代码功能性地分解为多个较小的例程,这些例程正如他们的名字所说的那样。您可能永远不会将程序移动到GUI或Web服务或其他任何方式,但当有人报告您的摊销计划错误,您可以通过更简单的编程控制它,而不是必须整天重新输入输入时,您肯定会更高兴长。

答案 3 :(得分:-1)

你错了,这样做:

public static void main(String[] args) {
    balance(1000.0, .05, 8.5); 
}