Как определить, имеет ли двойная переменная целочисленное значение?

Я пытаюсь найти возможные целочисленные корни квадратного уравнения с 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Это даст вам правильный вывод.

Вы можете попробовать как

Math.rint(d) == d
if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
    // int
}

Если переменная равна Math.floor, то ее Integer. Бесконечная проверка состоит в том, что это не будет работать для него.

Другие вопросы по тегам