4

我正在通过以前的考试试卷尝试建立我在 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
    }
}

在这里使用 Math.abs 是更好的选择吗?另外,我不确定 1e-14 在做什么?有人可以解释为什么我的讲师以这种方式返回他的布尔语句的任何可能性吗?我的似乎直截了当,因为我永远不会按照他的方式去做?

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

4

2 回答 2

2

为了让您大致了解为什么您的讲师的答案更好,而您的答案并不像您想象的那么简单,请考虑以下几点:

3.1444440 和 3.1444441

他们平等吗?那么在Java中,如果你简单地比较它们,==那么你会得到false. 这就是为什么你永远不应该将双精度/浮点类型与==. 比较浮动类型的最佳方法是使用tolerance value. 您想测试减去两种浮动类型的结果是否在该公差值范围内。例如您的老师使用的公差值,即1e-14。因此,如果sum-3.14在公差值内,则认为这两个数字相等。

另请注意,它Math.abs为您提供absolute了减法的值,因此您永远不会得到负数,否则您将不会得到正确的结果。

希望这能给你一个概述。

于 2013-03-17T12:49:40.783 回答
2

您的讲师发布的内容涉及浮点 epsilon的使用- 在您的情况下是1.0e14(请参阅此链接):

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

至于为什么要使用它,以及为什么 它更好- 请参阅此链接:

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

其中指出:

“如果您不知道基础测量的规模,则使用测试“abs(a/b - 1) < epsilon”可能比简单地比较差异更可靠”

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

浮动和双重比较最有效的方法是什么?

于 2013-03-17T12:49:52.777 回答