2012-12-17 66 views
2

我試圖找到與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.0143.0打印時餘回聲,所以我到控制檯'm只對這樣的 double值感興趣,而不是143.00001) 我的問題是,我怎樣才能確保任何root有一個整數值? 如果root1 = 143.0則例如root1 == 143應該返回true。我試過root1 == Math.floor(root1),但它沒有奏效。

+0

也許是root1 * 1000 == Math.floor(root1)* 1000? – Kubi

+1

我認爲最好檢查一下傳遞給等式的'Double.intValue(root1)'是否真的滿足它。 –

+1

你永遠不會在數字水平上解決這個問題。有限的計算機不能對實數的完整複雜性進行建模。 –

回答

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 
} 
+0

嗨yogendra,謝謝你的提示。實際上使用_int_對於我的問題中的某些情況(例如大值根)不起作用,但使用_long_肯定有幫助。 – Juvanis

2

使用雙值時,絕對不應該使用相等性檢查。這樣定義

double epsilon = 0.0000001; 

精度值然後檢查差是否幾乎等於epsilon

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

您應該使用round,因爲舍入誤差可能會小於所需的數值。 –

+3

這測試了錯誤的東西,它測試了假定的根是否接近整數;所需要的是一個測試,以確定最接近的假定根的整數是否是原方程的根。 –

+0

基本上你是對的。但選擇足夠的準確性會導致相同的結果。 – Simon

2

您可以測試的整數值,如果它是一個解決方案也:

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

該答案處理兩種情況之間的不確定性:具有幾乎完全是整數的根的方程和具有僅由原始解逼近的整數根的方程。但是,我認爲使用Math.rint來處理略小於解的整數解的近似情況會更好。 –

+0

標識符名稱中不能包含「²」。 –

+0

我用peudo-code編寫它。 – manji

0

你可以試試

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

如果變量等於Math.floor那麼它的整數。無限檢查是因爲它不會爲它工作。

0

如果你想要一個整數結果使用round,因爲你的錯誤可能意味着該數字稍大或略小。

long l = Math.round(value); 

舍入到一個固定的小數位數可以使用

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

的最佳方式將檢查是否(Math.floor(root1)-root1)<=0.0000001 它會給你正確的輸出。

相關問題