Как определить, имеет ли двойная переменная целочисленное значение?
Я пытаюсь найти возможные целочисленные корни квадратного уравнения с Java.
Вот фрагмент из моего кода:
double sqrtDiscriminant = Math.sqrt(b * b - 4 * a * c);
double root1 = ((-1.0 * b) - sqrtDiscriminant) / (2.0 * a);
double root2 = ((-1.0 * b) + sqrtDiscriminant) / (2.0 * a);
За a = 2
, b = -1
а также c = -40755
один из корней 143.0
(143.0
выводится на консоль, когда я его повторяю, поэтому меня интересуют только такие двойные значения, а не 143.00001
) Мой вопрос: как я могу убедиться, что любой корень имеет целочисленное значение? Если root1 = 143.0
тогда например root1 == 143
должен вернуть истину.
Я старался root1 == Math.floor(root1)
но это не сработало.
7 ответов
Если бы я был вами, я просто возьму int/long
значение корней и еще раз проверьте уравнение, чтобы убедиться, что int/long
значение корня в порядке или нет, например
// using round because an equivalent int/long may be represented by a near binary fraction
// as floating point calculations aren't exact
// e.g. 3.999999.. for 4
long longRoot = Math.round(root1);
if(a*longRoot*longRoot + b*longRoot + c==0){
//its valid int root
}else{
//ignore it
}
Вы никогда не должны использовать проверки на равенство при работе с двойными значениями. Определите значение точности как
double epsilon = 0.0000001;
Затем проверьте, равна ли разница почти epsilon
:
if(Math.abs(Math.floor(value)-value) <= epsilon) { }
Вы можете проверить целочисленное значение, если это решение также:
x = Math.floor(root1);
if(a*x*x+b*x+c == 0)
...
Если вы хотите получить целочисленный результат, используйте округление, поскольку ваша ошибка может означать, что число немного больше или немного слишком мало.
long l = Math.round(value);
Для округления до фиксированного числа десятичных знаков вы можете использовать
double d = Math.round(value * 1e6) / 1e6; // six decimal places.
Лучший способ будет проверить, (Math.floor(root1)-root1)<=0.0000001
Это даст вам правильный вывод.
if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
// int
}
Если переменная равна Math.floor, то ее Integer. Бесконечная проверка состоит в том, что это не будет работать для него.