我正在尝试用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
应该返回true。
我试过了root1 == Math.floor(root1)
,但它没有用。
答案 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
它会给你正确的输出。