我有两个双重值。我想检查两个双精度值是否相同。我有两种方法来比较这个双精度值。
第一种方法:
double a = 0.1;
double b = 0.2;
if(a == b) {
System.out.println("Double values are same");
}另一种比较的方法是:
if(Double.compare(a, b) == 0) {
System.out.println("Double values are same");
}哪种方法是最好的,也是准确的?对于比较双精度值,这两种方法是否相同?
发布于 2015-11-28 21:46:50
Double.compare处理NaN和负零的方式与==不同。对于Double.compare,-0.0d不等于0.0d。
例如下面的代码:
public static void main(String... args) {
double a = -0.0d;
double b = 0.0d;
if (a == b) {
System.out.println("a == b");
}
if (Double.compare(a, b) == 0) {
System.out.println("Double.compare(a, b) == 0");
}
}将仅打印a == b。
因此,这两个操作是不等价的。根据您的需求使用一个或另一个。
关于== (和!=)的确切规则可以在JLS、section 15.21.1中找到。
根据IEEE754标准的规则执行
浮点相等测试:
根据浮点数的这些注意事项,以下规则适用于整数操作数或NaN以外的浮点操作数:
发布于 2015-11-28 21:49:40
让我们分析一下这部分:
if(Double.compare(a, b) == 0)通过查看Double.compare的documentation,一个可能的实现可能如下所示(显然它将是一个更优化的实现,但这只是为了讨论):
return a == b ? 0 : (a < b ? -1 : +1);然后,你有另一个比较,所以它变成:
if((a == b ? 0 : (a < b ? -1 : +1)) == 0)在另一种情况下,您可以使用==进行简单的比较,即:
if(a == b)也就是说,就精度而言,我猜结果是相同的,因为double的底层表示不会改变,与0的比较似乎不会影响精度。
哪一个是最好的?
好吧,从上面的例子中,我会说更简单的直接比较值,你只对相等感兴趣,即使你不太可能面临一个问题,这将受益于选择这样的比较的最佳方法。无论如何,当您不仅对相等感兴趣,而且对大于和/或小于的概念感兴趣时,使用Double.compare的方法更适合这些情况。
发布于 2015-11-28 21:48:03
这两个选项对于检查两个数字是否相等都是完全有效的。我个人会说==更好,但这只是我个人的看法。
当你想知道为什么你的变量不相等时,double.compare()更好。它返回的信息比true或false多一点-如果左侧较小,则返回负值;如果右侧较小,则返回正值。
https://stackoverflow.com/questions/33971989
复制相似问题