2

我正在尝试使用 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 = -1c = -40755, 其中一个根是143.0 (143.0当我回显它时打印到控制台所以我只对这样的双精度值感兴趣, 不是143.00001) 我的问题是, 我怎样才能确保任何根都有一个整数值?如果root1 = 143.0然后例如root1 == 143应该返回true。

我试过root1 == Math.floor(root1)了,但没有用。

4

7 回答 7

3

You should never use equality checks when working with double-values. Define an accuracy value like

double epsilon = 0.0000001;

Then check whether the difference is nearly equal to epsilon:

if(Math.abs(Math.floor(value)-value) <= epsilon) { }
于 2012-12-17T15:04:21.073 回答
2

You can test the integer value if it's a solution also:

x = Math.floor(root1);
if(a*x*x+b*x+c == 0)
...
于 2012-12-17T15:05:03.483 回答
2

If I would be you, I will simply take the int/long value of the roots and re-verify the equation to make sure that int/long value of the root is OK or not e.g.

// 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
}
于 2012-12-17T15:07:01.920 回答
1

如果您想要整数结果,请使用 round 因为您的错误可能意味着该数字稍大或稍小。

long l = Math.round(value);

要四舍五入到固定的小数位数,您可以使用

double d = Math.round(value * 1e6) / 1e6; // six decimal places.
于 2012-12-17T15:10:24.310 回答
0

You can try as

Math.rint(d) == d
于 2012-12-17T15:06:57.353 回答
0
if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
    // int
}

如果变量等于 Math.floor 则它的整数。无限检查是因为它对它不起作用。

于 2012-12-17T15:10:11.210 回答
0

最好的方法是检查(Math.floor(root1)-root1)<=0.0000001 它是否会给你正确的输出。

于 2012-12-18T10:07:55.893 回答