Определение целочисленности double в Java: сравнение и приведение типов
Для мгновенной проверки целочисленности значения типа double сопоставьте его с округленной версией посредством Math.rint() или проверьте отсутствие дробной части с помощью Math.floor() . Важно учесть бесконечные значения, чтобы избежать нежелательных проблем.
Скопировать код
double value = // ваше значение типа double boolean isInteger = (value == Math.rint(value)) && !Double.isInfinite(value); // Этим образом можно определить, является ли значение типа double целым числом. Можно использовать и другой метод. boolean isInteger = (value == Math.floor(value)) && value != Math.ceil(value); // Этот вариант работает также корректно. Выбор за вами.
Оба варианта подтверждают, что у числа типа double отсутствует дробная часть и оно не бесконечно, что является признаками целого числа.
Откроем завесу тайны: Рассмотрим крайние ситуации
Метод приведения типов
Сопоставление значения double с его приведённым в int вариантом — примитивная идея, но она требует осмысленности: не все числа могут без ошибок пройти этап приведения.
Как правильно сравнивать double в java
При сравнении значений типа double в Java следует быть осторожным из-за того, что внутреннее представление чисел с плавающей точкой может быть не точным. Например, значения, которые должны быть равными, могут отличаться на очень малое значение.
Вместо использования операторов == или != для сравнения значений типа double рекомендуется использовать методы класса Double , такие как equals() или compare() , которые предоставляют более точный способ сравнения чисел с плавающей точкой.
double d1 = 0.1 + 0.2; double d2 = 0.3; if (Double.valueOf(d1).equals(Double.valueOf(d2))) System.out.println("d1 и d2 равны"); >
В этом примере мы сравниваем два значения типа double , которые должны быть равными. Для сравнения используем метод equals() , который возвращает true , если значения равны, и false в противном случае.
Для сравнения двух значений типа double по их относительной близости друг к другу используйте метод compare() :
double d1 = 0.1 + 0.2; double d2 = 0.3; if (Double.compare(d1, d2) == 0) System.out.println("d1 и d2 близки"); >
Этот метод возвращает 0, если значения равны, 1, если первое значение больше второго, и -1, если первое значение меньше второго. Мы проверяем, равны ли значения, используя == 0
Как сравнивать double java
Сравнение значений типа double в Java может быть несколько запутанным из-за погрешности вычислений с плавающей точкой. Рекомендуется сравнивать значения типа double с использованием заранее заданного уровня точности:
double x = 1.234; double y = 1.235; double epsilon = 0.0001; // уровень точности if (Math.abs(x - y) epsilon) System.out.println("Значения равны"); > else System.out.println("Значения не равны"); >
Здесь мы используем метод Math.abs() , чтобы получить абсолютное значение разницы между x и y . Если это значение меньше заданного уровня точности epsilon , мы считаем, что x и y равны. В противном случае они не равны.
Как в Java сравнить 2 вещественных числа на равенство?
У меня есть 2 вещественных числа, например типа double . Я хочу их сравнить на равенство с заданной точность. Как правильно выполнять такое сравнение? Пока в голову приходит такой вариант:
double x, y; . public boolean isEqual(double x, double y, double eps)
Кажется, что в Java должны быть встроенные способы сравнить 2 вещественных числа. Такие существуют?
Отслеживать
13.8k 12 12 золотых знаков 44 44 серебряных знака 77 77 бронзовых знаков
задан 26 ноя 2017 в 9:42
7,195 10 10 золотых знаков 38 38 серебряных знаков 68 68 бронзовых знаков
ваш вариант самый правильный, метод только сделайте статическим и, возможно, напишите перегрузку со стандартным эпсилоном. и ещё возможно, можно написать другой метод, сравнивающий относительные отклонения вместо абсолютных
26 ноя 2017 в 10:29
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Вообще, это довольно интересный вопрос.
Да, в общем случае всегда рекомендуется использовать что-то вроде:
bool isEqual = fabs(a1 – a2)
Но более интересный вопрос, какое значение для epsilon использовать.
К примеру, в C++ в float.h есть константа FLT_EPSILON , равная 1E-5 . Всё, можно такое же значение использовать, да?
Вполне, если числа большие. Но если у вас число в промежутке [0;1], то начинаются проблемы. Точность вычисления будет соизмерима с фактическим значением, что приведёт к тому, что на такое сравнение нельзя будет положиться.
Относительный эпсилон
Для сравнения чисел можно руководствоваться правилом:
Для сравнения a1 и a2 вычисляем diff = fabs(a1-a2). Если diff меньше ,чем n% от max(abs(a1), abs(a2)), тогда a1 и a2 можно считать равными.
public static bool almostEqualRelative(float a, float b, float maxRelDiff = FLT_EPSILON) < // находим разницу float diff = fabs(a - b); A = fabs(a); B = fabs(b); // находим большее float largest = (b >a) ? b : a; if (diff
Более сложно и подробней про это можно почитать в этой занятной статье.