【问题标题】:Method not working completely? What could be the error?方法不完全奏效?可能是什么错误?
【发布时间】:2013-04-12 15:50:11
【问题描述】:

我只是在做一些项目,我找不到以下代码有什么问题:

double getInterest(double amt,double tax){  
        double diff=0;
        double refund=0;
        double interest=0;
        if(amt>=(tax*0.4)){
           diff=amt-(tax*0.4);
           System.out.println(" "+diff);  //This is not working.Nothing gets printed.
           refund=diff;                   //The value is not being assigned to refund.
        }                                 //refund remains to be 0 throughout.
         interest=diff*0.01*12;
         if(refund>0){
            JOptionPane.showMessageDialog(null,"Your refund is: "+refund);
         }
        return interest;
}

我无法找出代码中的任何错误。但它仍然不能完全工作。
错误以cmets形式在代码中给出。
有人帮我找出错误并解决这个问题吗?

我不知道为什么diff 的值没有被打印出来,以及为什么diff 的值没有被分配给变量refund

我在 NetBeans 中工作,它没有给出任何类型的编译时错误。

我尝试使用println 来检查diffrefund 的值,但是这些值没有被打印出来。

【问题讨论】:

  • 肯定有编译错误!测试中缺少一个括号 if (amt >= (tax * 0.4) { 并且未声明 interest。这是真正的代码吗?
  • 一方面,永远不要使用双精度类型来表示金钱。
  • 对不起,我刚刚在编辑器中输入了它,忘记声明兴趣并给出括号。而且我很确定没有任何编译器错误。当我尝试运行代码时,NetBeans 会出错。但它没有给出任何错误,编辑器中也没有任何错误符号。
  • 只需调试代码并在if 语句上添加断点。并检查两个变量的值是多少。这些问题你应该自己解决。
  • 您是否检查过您传递给此方法的值以及它们是否符合进入 if 块的 if 条件。在 if 之前打印 amt 和 tax 并查看。

标签: java variables runtime-error development-environment


【解决方案1】:

如果if 块中的语句从未被执行,这意味着在参数满足条件amt >= (tax*0.4) 的情况下永远不会调用此方法。所以真正的问题是,你传递给这个方法的值是什么?

【讨论】:

  • 该值满足if 条件。但是diff 的值没有分配给refund
  • 这意味着你应该看到打印出来的差异?
  • @GCJavaDeveloper 不!我刚刚添加它来检查diff 的值,但它没有被打印出来。
【解决方案2】:

您的包围 if(amt>=(tax*0.4){ 行在第一个 { 括号之前缺少一个结束 ) 括号。确保检查您的包围并确保您在选项菜单中打开了所有错误(如果可以的话)。

由于括号错误,此代码不应编译。检查 Netbeans 是否正在编译正确的项目,因为这应该在编译时发疯。

【讨论】:

  • 正在编译。在此编辑器中输入代码时,我只是忘记提供)。而且我仍然很确定没有任何编译器错误。
  • 我只能按照@Rohit 所说的去做并使用调试器,它很可能与您的输入值有关。
【解决方案3】:

在处理货币时应始终使用BigDecimal 类型以避免double precision issues

这是BigDecimal中重写的代码

BigDecimal getInterest(final BigDecimal amount, final BigDecimal tax) {
    BigDecimal diff = BigDecimal.ZERO;
    BigDecimal refund = BigDecimal.ZERO;
    BigDecimal reducedTax = new BigDecimal("0.4").multiply(tax);
    System.out.println("Amount is " + amount + ". Tax times 0.4 is " + tax + ".");
    if (amount.compareTo(reducedTax) >= 0) {
        diff = amount.subtract(reducedTax);
        System.out.println(diff);
        refund = diff;
    }
    BigDecimal interest = diff.multiply(new BigDecimal("0.01")).multiply(new BigDecimal("12"));
    if (refund.compareTo(BigDecimal.ZERO) > 0) {
        JOptionPane.showMessageDialog(null, "Your refund is: " + refund);
    }
    return interest;
}

是的,我知道它更丑陋。它也会慢很多。但它是新的正确

关于您的问题,大概代码没有输入if,因为amount 不大于tax * 0.4 - 如果您确定是这样,那么您可能已经遇到了双精度问题。

我在if 之前添加了一个println,因此您可以在测试发生之前查看这些值。

【讨论】:

  • 我已经使用println 进行了测试,但没有打印出来。
  • 你在做什么。他们正在某处打印 - 这取决于stdin 的去向。
  • 我没有通过stdin 找到你?
  • 对不起,我的意思是stdout 真的。当您执行println 时,程序输出的位置。如果您从命令行运行,那么这是命令行,否则它可以在任何地方。例如,Tomcat 拦截了System.out,所以一切都在 Tomcat 的日志中结束。
猜你喜欢
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2013-06-25
  • 2018-03-10
相关资源
最近更新 更多