Ответ 1
В принципе, вы не должны делать точные сравнения, вы должны сделать что-то вроде этого:
double a = 1.000001;
double b = 0.000001;
double c = a-b;
if (Math.abs(c-1.0) <= 0.000001) {...}
Простое сравнение двух двойных значений в Java создает некоторые проблемы. Давайте рассмотрим следующий простой фрагмент кода на 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
, оценку выражения ((ab)==1.0)
но это не так. Вместо этого он возвращает false
потому что вычисление этого выражения равно 0.9999999999999999
которое фактически ожидалось равным 1.0
что не равно 1.0
следовательно, условие оценивается как логическое false
. Каков наилучший и предлагаемый способ преодоления такой ситуации?
В принципе, вы не должны делать точные сравнения, вы должны сделать что-то вроде этого:
double a = 1.000001;
double b = 0.000001;
double c = a-b;
if (Math.abs(c-1.0) <= 0.000001) {...}
Вместо использования удвоений для десятичной арифметики, используйте java.math.BigDecimal. Это приведет к ожидаемым результатам.
Для справки рассмотрим этот fooobar.com/questions/80048/...
Вы можете использовать Double.compare; Он сравнивает два указанных двойных значения.
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!");
double a = 1.000001;
double b = 0.000001;
System.out.println( a.compareTo(b) );
Возвращает:
-1: "а" численно меньше, чем "б".
0: "а" равно "б".
1: "а" больше, чем "б".
Рассмотрим эту строку кода:
Math.abs(firstDouble - secondDouble) < Double.MIN_NORMAL
Возвращает значение firstDouble равно secondDouble. Я не уверен относительно того, сработает ли это в вашем конкретном случае (как отметил Кевин, выполнение любой математики для чисел с плавающей запятой может привести к неточным результатам), однако у меня возникли трудности при сравнении двух двойных, которые действительно были равны, и все же использование метода "CompareTo" не вернуло 0.
Я просто оставляю это на всякий случай, если кому-то нужно сравнить, чтобы проверить, действительно ли они равны, а не просто похожи.
Просто используйте метод Double.compare() для сравнения двойных значений.
Double.compare((d1, d2) == 0)
double d1 = 0.0;
double d2 = 0.0;
System.out.println(Double.compare((d1,d2) == 0)) // true