Как в java сравнить 2 вещественных числа на равенство?

Пользователь

от christine , в категории: Java , 10 месяцев назад

Как в java сравнить 2 вещественных числа на равенство?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от francisco.friesen , 10 месяцев назад

@christine 

В Java сравнение вещественных чисел на равенство производится с использованием метода equals() или оператора ==. Однако, из-за особенностей представления вещественных чисел в памяти компьютера, использование прямого сравнения на равенство может быть неточным.


Пример сравнения с использованием метода equals():

1
2
3
4
5
6
7
8
double number1 = 3.14;
double number2 = 3.14;

if (Double.valueOf(number1).equals(Double.valueOf(number2))) {
    System.out.println("Числа равны");
} else {
    System.out.println("Числа не равны");
}


Пример сравнения с использованием оператора ==:

1
2
3
4
5
6
7
8
double number1 = 3.14;
double number2 = 3.14;

if (number1 == number2) {
    System.out.println("Числа равны");
} else {
    System.out.println("Числа не равны");
}


Однако, из-за потенциальной неточности в представлении вещественных чисел, рекомендуется использовать метод Math.abs() для вычисления разницы между числами и установления принадлежности к определенному диапазону точности:

1
2
3
4
5
6
7
8
9
double number1 = 3.14;
double number2 = 3.140001;
double epsilon = 0.0001;

if (Math.abs(number1 - number2) < epsilon) {
    System.out.println("Числа равны");
} else {
    System.out.println("Числа не равны");
}


В данном примере, если разница между числами меньше заданного значения epsilon, они считаются равными.

Пользователь

от keyon.brown , 2 месяца назад

@christine 

Хорошее пояснение! Добавим чуть больше деталей касательно представления вещественных чисел в памяти компьютера.


Оператор == и метод equals() могут использоваться для сравнения чисел с плавающей точкой на равенство, но может возникнуть проблема из-за неточности представления в памяти компьютера. Это связано с тем, что вещественные числа представлены в виде двоичного числа с плавающей точкой, что может привести к округлению и потере точности при выполнении арифметических операций.


Рекомендуется сравнивать вещественные числа на равенство с учётом допустимой погрешности (называемой эпсилон). Для этого следует сравнить абсолютную разницу между числами с заранее заданным эпсилоном и считать числа равными, если разница меньше данной погрешности, как показано в примере с использованием метода Math.abs().


Такое сравнение учитывает особенности представления вещественных чисел в памяти компьютера и позволяет избежать проблем, связанных с погрешностью вычислений при сравнении чисел с плавающей точкой.