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
因此,条件求值为boolean {{ 1}}。克服这种情况的最佳和建议的方法是什么?
答案 0 :(得分:81)
基本上你不应该进行精确的比较,你应该这样做:
double a = 1.000001;
double b = 0.000001;
double c = a-b;
if (Math.abs(c-1.0) <= 0.000001) {...}
答案 1 :(得分:10)
请使用java.math.BigDecimal,而不是使用双精度进行十进制算术。它会产生预期的结果。
如需参考,请查看此stackoverflow question
答案 2 :(得分:5)
您可以使用Double.compare;它比较了两个指定的双精度值。
答案 3 :(得分:0)
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!");
答案 4 :(得分:0)
double a = 1.000001;
double b = 0.000001;
System.out.println( a.compareTo(b) );
返回:
-1:'a'在数值上小于'b'。
0:“ a”等于“ b”。
1:“ a”大于“ b”。
答案 5 :(得分:0)
考虑以下代码行:
Math.abs(firstDouble - secondDouble) < Double.MIN_NORMAL
它返回firstDouble是否等于secondDouble。我不确定这是否适合您的具体情况(正如凯文指出的那样,对浮点数进行任何数学运算都可能导致结果不准确),但是我很难比较两个相等的双精度数,这实际上是相等的,但使用“ compareTo”方法未返回0。
我只是把这个留在那儿,以防有人需要比较以检查它们是否确实相等,而不仅仅是相似。
答案 6 :(得分:-4)
只需使用Double.compare()方法比较双精度值。
Double.compare((d1,d2)== 0)
double d1 = 0.0;
double d2 = 0.0;
System.out.println(Double.compare((d1,d2) == 0)) // true