【问题标题】:Calculator in java displays double instead if intjava中的计算器显示double而不是int
【发布时间】:2014-05-26 21:31:08
【问题描述】:

嘿,伙计们,我正在构建一个 java 计算器,一切正常,除了我用双数进行计算。

问题是当我想做 0.3 + 0.5 = 0.8 时工作正常,但是当我做 6 + 6 = 12.0 时

我该如何解决这个问题,所以当结果是 .0 最后它显示一个整数?

我的代码是:

public void actionPerformed(ActionEvent e) {
                int j = 0;
                r2 = Double.parseDouble(textField.getText());
                if (option.equals("+")) {
                    result = r1 + r2;
                }
                if (option.equals("-")) {
                    result = r1 - r2;
                }
                if (option.equals("*")) {
                    result = r1 * r2;
                }
                if (option.equals("/")) {
                    result = r1 / r2;
                }
                textField.setText(result + " ");
            }

【问题讨论】:

标签: java swing


【解决方案1】:

使用DecimalFormat 对象(请参阅http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html 的文档)。

例子:

DecimalFormat df = new DecimalFormat("############.#");
System.out.println(df.format(result));

【讨论】:

  • 这不是将12.34 转换为12.3 吗?
  • 没错。您可以添加任意数量的 # 字符,以获得所需的精度。任何“零结尾”都会自动从字符串中删除。
【解决方案2】:

您可以检查您的结果是否为 int,如果是则将其整数值设置为这样的结果。

public void actionPerformed(ActionEvent e) {
            int j = 0;
            r2 = Double.parseDouble(textField.getText());
            if (option.equals("+")) {
                result = r1 + r2;
            }
            if (option.equals("-")) {
                result = r1 - r2;
            }
            if (option.equals("*")) {
                result = r1 * r2;
            }
            if (option.equals("/")) {
                result = r1 / r2;
            }
            if ((result == Math.floor(result )) && !Double.isInfinite(result )) {
                 textField.setText((int)(result) + " ");
            } else textField.setText(result + " ");
        }

【讨论】:

    【解决方案3】:

    您可以检查result 中是否包含整数,如下所示:

    if((int) result == result) {
           textField.setText((int)result + " ");
    } else {
           textField.setText(result + " ");
    }
    

    编辑

    正如@Hovercraft Full Of Eels 所说,您可以花更多的心思来决定什么是整数,什么不是,特别是当result 类似于 5.99999997 并且简单地转换为 int 时会得到 5号码。

    final double epsilon = 1e-6;
    if(Math.abs(Math.rint(myVal) - myVal) < epsilon) {
        textField.setText(Math.round(myVal) + "");
    } else {
        textField.setText(String.format("%f", myVal));
    }
    

    【讨论】:

    • 我认为这正是 OP 想要的。但是您是否确认比较是双重比较而不是整数?净效应应该是if((double)((int) result) == result)
    • 您最好在此测试中使用较小的 epsilon 值检查数字是否非常接近,因为这种类型的相等性测试通常会因双打而失败。请看here
    • @BheshGurung 是的,您可以将强制转换添加回 double 以确保,但 Java 编译器会为您添加该强制转换。
    • 除了强制转换和引入的所有浮点问题外,不要使用字符串连接将原语转换为字符串 (+""),String.valueOf 方法在那里就是为了这个。
    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2016-06-28
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多