如何在Java中比较两个double值?
Java中两个double值的简单比较会产生一些问题。 让我们考虑以下Java中的简单代码段。
package doublecomparision;
final public class DoubleComparision
{
public static void main(String[] args)
{
double a = 1.000001;
double b = 0.000001;
System.out.println("\n"+((a-b)==1.0));
}
}
上面的代码似乎返回true,表达式((a-b)==1.0)的求值,但没有。 而是返回false,因为此表达式的计算值为0.9999999999999999,实际上预期为1.0,该值不等于1.0,因此条件的计算结果为布尔值false。克服这种情况的最佳方法是什么?
Lion asked 2020-02-10T17:00:00Z
7个解决方案
84 votes
基本上,您不应该进行精确比较,而应该执行以下操作:
double a = 1.000001;
double b = 0.000001;
double c = a-b;
if (Math.abs(c-1.0) <= 0.000001) {...}
Kevin answered 2020-02-10T17:00:20Z
11 votes
请勿将java.math.BigDecimal用作双精度十进制算术。 它将产生预期的结果。
作为参考,请看一下这个stackoverflow问题
Zaki Saadeh answered 2020-02-10T17:00:44Z
5 votes
您可以使用Double.compare; 它比较两个指定的double值。
Anand answered 2020-02-10T17:01:05Z
0 votes
int mid = 10;
for (double j = 2 * mid; j >= 0; j = j - 0.1) {
if (j == mid) {
System.out.println("Never happens"); // is NOT printed
}
if (Double.compare(j, mid) == 0) {
System.out.println("No way!"); // is NOT printed
}
if (Math.abs(j - mid) < 1e-6) {
System.out.println("Ha!"); // printed
}
}
System.out.println("Gotcha!");
Splash answered 2020-02-10T17:01:20Z
-1 votes
double a = 1.000001;
double b = 0.000001;
System.out.println( a.compareTo(b) );
返回值:
-1:“ a”在数值上小于“ b”。
0:“ a”等于“ b”。
1:“ a”大于“ b”。
Ibrahim answered 2020-02-10T17:01:53Z
-1 votes
考虑以下代码行:
Math.abs(firstDouble - secondDouble) < Double.MIN_NORMAL
它返回firstDouble是否等于secondDouble。 我不确定这是否适合您的具体情况(正如凯文指出的那样,对浮点数执行任何数学运算都会导致结果不精确),但是我很难比较两个相等的双精度数, 但是使用'compareTo'方法并没有返回0。
我只是把它留在那里,以防有人需要比较以检查它们是否确实相等,而不仅仅是相似。
ThePC007 answered 2020-02-10T17:02:25Z
-4 votes
只需使用Double.compare()方法比较双精度值即可。
Double.compare((d1,d2)== 0)
double d1 = 0.0;
double d2 = 0.0;
System.out.println(Double.compare((d1,d2) == 0)) // true
Chanaka Fernando answered 2020-02-10T17:02:49Z