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

Java 测试先前声明的变量和是否不等于3.14的布尔表达式,java,boolean,Java,Boolean,我正在努力复习以前的试卷,试图积累Java方面的经验。 这个问题有两个答案。第一个是我自己的,看起来很直截了当,第二个是我的讲师的,在我的Java开发的这个特定阶段,这让我感到困惑 这是我的密码: public class InClassTestTwoQ2 { public static void main(String[] args){ double sum = 3.14; System.out.println(test(sum)); System.out.print

我正在努力复习以前的试卷,试图积累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。
非常感谢。

< P>给你一个概览,为什么你的讲师的答案更好,而你的答案不像你想象的那么直截了当,考虑以下内容:

3.1444440和3.1444441

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

还要注意的是,
Math.abs
为您提供了减法的
绝对值,因此您永远不会得到负数,否则将无法得到正确的结果


希望这能为您提供一个概述。

您的讲师发布的内容涉及使用浮点epsilon——在您的案例中是
1.0e14
(请参阅此链接):

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

其中指出:

“如果您不知道基础测量的规模,请使用 测试“abs(a/b-1) 需要注意的一点是,所有平台和语言都必须在某种程度上处理浮点比较。尽管这个对话与您的语言(它是用C++编写的)无关,但讨论中提出的一些观点也适用于Java


浮动类型就是这样工作的。你必须阅读更多关于他们的内容才能完全理解。好的,谢谢。我将进一步研究。请看这篇文章:。我知道有点太多的信息。你应该可以在网上找到其他有用的文章。谢谢你的链接。我来看看!这对我们大多数人来说可能是显而易见的,但我仍然想指出,1e-14是表示1*10^-14的另一种方式(10乘以负14的幂),这是一个很好的答案。谢谢老实说,我的回答很差。很高兴知道,很好。当我第一次看到老师的回答时,我在想你为什么这样回答?我们真的认为这是一个非常疯狂的回答!?!但经过对这些评论的反思,答案确实不错。另外,我在这里学到了一些东西。可以说浮点的重要性。不客气!尽管如此,我必须说你有一位很棒的教练——因为我直到很久很久以后才了解浮点比较及其重要性。他是一位非常好的教练,他对我们很有耐心。“老实说,他做得很好。”首席科学家,不幸的是没有。你可以选择其中之一,也可以选择两者都不做。这完全取决于你决定哪一个更好地回答了你的问题。在大多数情况下,它是一个,在某些情况下,没有。不管怎样,这都是以前发生过的——所以在这方面你并不孤单。我只是很高兴我能帮上忙,而且我帮了忙。祝你的决定好运!没问题,首席科学家。不客气。这样的事情经常发生。最重要的是你的问题得到了解决,你在这个过程中学到了一些东西!而且,我们能够帮助你!双赢