如何判断double变量是否具有整数值?

时间:2012-12-17 15:01:05

标签: java math integer double double-precision

我正在尝试用Java找到二次方程的可能整数根。

enter image description here

以下是我的代码中的代码段:

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 = 2b = -1c = -40755,其中一个根是143.0 (当我回应时,143.0被打印到控制台,所以我只对此感兴趣 双值,而不是143.00001) 我的问题是,如何确保任何根都有整数值? 如果是root1 = 143.0,那么例如root1 == 143应该返回true。

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

7 个答案:

答案 0 :(得分:2)

使用双值时,绝不应使用等式检查。定义准确度值,如

double epsilon = 0.0000001;

然后检查差异是否几乎等于epsilon

if(Math.abs(Math.floor(value)-value) <= epsilon) { }

答案 1 :(得分:2)

如果它也是一个解决方案,你可以测试整数值:

x = Math.floor(root1);
if(a*x*x+b*x+c == 0)
...

答案 2 :(得分:2)

如果我是你,我会简单地取根的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
}

答案 3 :(得分:0)

您可以尝试

Math.rint(d) == d

答案 4 :(得分:0)

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

如果变量等于Math.floor,那么它的Integer。无限的检查是因为它不适用于它。

答案 5 :(得分:0)

如果你想要一个整数结果使用round,因为你的错误可能意味着这个数字有点太大或太小了。

long l = Math.round(value);

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

double d = Math.round(value * 1e6) / 1e6; // six decimal places.

答案 6 :(得分:0)

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