【问题标题】:NetBeans Java Calculator QueryNetBeans Java 计算器查询
【发布时间】:2013-12-10 11:13:38
【问题描述】:

我遇到了一个小问题,例如当我乘以 5*5 时,答案将是 25。但是当乘以 5*5*5 时,答案仍然是 25.. 帮助?

变量

public class Calculator extends javax.swing.JFrame {

    double total;
    double input;

    boolean plus = false;
    boolean multi = false;
    boolean division = false;
    boolean minus = false;
}

乘法按钮

private void btnMultiActionPerformed(java.awt.event.ActionEvent evt) {                                         
    input = Double.parseDouble(txtArea.getText());

    total = input;
    multi = true;
    txtArea.setText(null);
}         

等号按钮

private void btnEqualsActionPerformed(java.awt.event.ActionEvent evt) {                                          

    if (plus == true )
    {
        input = Double.parseDouble(txtArea.getText());    
        total = input + total;        
    }
    else if (minus == true)
    {
        input = Double.parseDouble(txtArea.getText());        
        total = input - total;
    }
    else if (multi == true)
    {
        input = Double.parseDouble(txtArea.getText());        
        total = input * total;
    }
    else if (division == true)
    {
        input = Double.parseDouble(txtArea.getText());        
        total = input / total;
    } 
    else
    {
    }

    txtArea.setText("" +total);


} 

【问题讨论】:

  • 你需要嵌套乘法或者使用ScriptEngine.eval操作。
  • 我找不到地方...你正在做的地方 5*5*5... else if (multi == true) { input = Double.parseDouble(txtArea.getText( ));总计 = 输入 * 总计; } 只反映乘法,但不反映任何 5*5*5...
  • 你做得对可能是一些 UI 问题。更新您问题中的完整代码。
  • 你试过我的答案了吗...user2964786先生

标签: java netbeans calculator helpers


【解决方案1】:

您将输入 (5*5) 解析为 Double,得到结果 5,因为 *5 不是 Double 的一部分。

然后将input 分配给total。然后将inputtotal 相乘,得到25。

你的逻辑完全按照它被告知的去做,但是你想要真正计算一些东西。这将变得更加困难。

5*5*5 的情况下,您的input 将再次只是5

我已经解释了为什么 5*5 = 255*5*5 = 25 用于您的程序。

解决方案是制作某种解析引擎,翻译如下:

  • 5*5mul(5, 5)
  • 5*5*5mul(5, mul(5, 5))

然后有它背后的Java操作来真正计算它。

【讨论】:

  • 他不是在解析5*5,好好阅读代码。每次执行一个动作他都会清除 txt 区域
  • @vels4j 所以他第一次解析5,然后所有input 都神奇地消失了。我想我已经说过了,如果我错了,请纠正我。
  • 您将输入 (5*5) 解析为 Double,结果为 5 这是错误的,无法解析字符串 5*5。假设喜欢在计算器中进行操作。按 5 -> 按 * -> 按 5 -> 按 =
  • @vels4j 我认为他正在使用JTextArea 并且有一个JButton 来计算结果。至少这是他的代码所暗示的。所以看起来他正在一次解析整个JTextArea.getText()
  • 他正在解析整个 JTextArea.getText() 是的,但是他每次操作都会清除文本区域。文本区域永远不会有像 5*5 这样的文本
【解决方案2】:

问题在于 btnMultiActionPerformed 方法中的未检查分配。

total = input;

因此,每次单击“乘”按钮时,旧结果都会丢失。
应按如下方式进行检查分配:

private void btnMultiActionPerformed(java.awt.event.ActionEvent evt) {                                         
            input = Double.parseDouble(txtArea.getText());
            //perform check below, instead of unchecked assignment
            if (total == 0)
                total = input;
            else
                total *= input;
            multi = true;
            txtArea.setText(null);
        } 

【讨论】:

  • 这个解决方案会出错,考虑用户第一次来到应用程序的场景......然后总不会等于零,因为它没有初始化,然后它会进入 else将总计乘以输入并存储在总计中的部分......这将导致不稳定和不需要的结果。
  • @DanglingPointer:你错了,它永远不会出错,因为在Java中,double默认初始化为零,请参考Java Documentation
  • 好的...但是它被初始化为 0.0,因为它是一个双精度值,而不是 0。
  • @DanglingPointer: 你又错了,Java 有Binary Numeric Promotion If either operand is of type double, the other is converted to double. 也可以参考== Documentation。祝 Java 好运
  • 我没有说它会产生任何错误......但是在阅读了上面提到的链接之后......我写了评论,是的...... if 条件将满足 0 或0.0...
【解决方案3】:

您的函数 private void btnMultiActionPerformed(java.awt.event.ActionEvent evt) 每次都会重置 textarea...所以无论何时调用它,它只会满足一个值,而不会满足旧结果... 从此函数中删除以下行并检查...我想它会解决问题

txtArea.setText(null);

如果您每次都需要重置文本区域,请考虑以下解决方案...

解决方案:

第一步:在声明变量total时,还需要初始化为0.0。

第 2 步:对您的语句应用以下检查,即btnMultiActionPerformed 函数中的total = input;

检查:

if (total > 0.0)
            total = total * input;
        else
            total = input;

这肯定会为您完成这项工作。

悬空指针

【讨论】:

    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多