有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

测试先前声明的变量和是否不等于3.14的java布尔表达式

我正在努力复习以前的试卷,试图积累Java方面的经验。 这个问题有两个答案。第一个是我自己的,看起来很直截了当,第二个是我的讲师的,在我的Java开发的这个特定阶段,这让我感到困惑

这是我的密码:

public class InClassTestTwoQ2
{
public static void main(String[] args){
    double sum = 3.14;

    System.out.println(test(sum));
    System.out.println(testTwo(sum));
}

public static boolean test(double sum){
    return sum != 3.14; //My boolean test return type
    }
public static boolean testTwo(double sum){
    return Math.abs(sum - 3.14) > 1e-14; //Lecturer boolean test return type
    }
}

他在用数学。这里有更好的选择吗?此外,我不确定1e-14在做什么? 有人能解释一下为什么我的讲师用这种方式返回他的布尔语句吗?我的似乎是直截了当的,因为我永远不会按照他的方式去做

另外,请原谅我代码中的任何错误。我还在学Java。 非常感谢


共 (2) 个答案

  1. # 1 楼答案

    给你一个概述,为什么你的讲师的答案更好,而你的答案不像你想象的那么简单,考虑下面的内容:

    3.1444440和3.1444441

    他们平等吗?在Java中,如果你简单地通过==来比较它们,那么你会得到false。这就是为什么永远不要将double/floating类型与==进行比较。比较浮动类型的最佳方法是使用tolerance value。您希望测试减去两个浮动类型的结果是否在该公差值范围内。例如,老师使用的公差值为^{。因此,如果sum-3.14在公差值范围内,则认为这两个数字相等

    还要注意的是Math.abs给出了减法的absolute值,因此永远不会得到负数,否则将无法得到正确的结果

    希望这能给你一个概述

  2. # 2 楼答案

    您的指导老师发布的内容涉及使用浮点ε——在您的案例中是^{(请参阅此链接):

    http://en.wikipedia.org/wiki/Machine_epsilon

    至于你为什么要使用这个,以及为什么它更好,请参考以下链接:

    http://www.ibm.com/developerworks/java/library/j-jtp0114/

    其中规定:

    "If you don't know the scale of the underlying measurements, using the test "abs(a/b - 1) < epsilon" is likely to be more robust than simply comparing the difference"

    需要注意的一点是,所有平台和语言都必须在一定程度上处理浮点比较。虽然这个对话与您的语言(它是C++语言)无关,但讨论中提出的一些观点也适用于Java

    What is the most effective way for float and double comparison?