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 = 2b = -1およびの場合c = -40755、ルートの1つは143.0143.0エコーするとコンソールに出力されるため、このようなdouble値のみに関心があります143.00001)です。私の質問は、ルートが整数値であることを確認するにはどうすればよいですか?その場合root1 = 143.0、egroot1 == 143はtrueを返す必要があります。

試しroot1 == Math.floor(root1)ましたが、うまくいきませんでした。

4

7 に答える 7

3

二重値を使用する場合は、等価性チェックを使用しないでください。次のような精度値を定義します

double epsilon = 0.0000001;

次に、差がほぼ等しいかどうかを確認しepsilonます。

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

それが解決策である場合は、整数値をテストすることもできます。

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

私があなたである場合、私は単に根のint/long値を取り、方程式を再検証してint/long、根の値がOKであるかどうかを確認します。

// 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

整数の結果が必要な場合は、エラーが数値がわずかに大きすぎるか、わずかに小さすぎることを意味する可能性があるため、ラウンドを使用します。

long l = Math.round(value);

小数点以下の桁数を四捨五入するには、

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

あなたはとして試すことができます

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 に答える