2013-12-12 60 views
0

我有一些雙數如:3.03.14.05.2等等。如何判斷一個雙數以.0結尾的Java

我可以判斷數字是否以.0結尾,如3.04.0

有沒有最好的方法來做到這一點?

PS:我將它們轉換爲字符串類型,但我認爲這不是最好的方法。

double i = 3.0; 
    String d = i + ""; 
    return d.endsWith(".0"); 
+0

那麼你會考慮3.0001與「0」或「1」結束嗎? (十進制數字「在某處結束」的概念本質上是有問題的) –

+0

@GyroGearless有道理。我沒有想到這麼遠 –

回答

4

你可以做這樣的事情。

double d = 10.09; 
System.out.println(d == Math.floor(d)); 
// True if it ends with 0, else false 

// If you want to return the boolean result 
return d == Math.floor(d); 

注:它會工作,直到值是double d = 10.000000000000001;。小數點的另一個0最終會給出錯誤的結果(全部歸功於floating point representation inaccuracy)。

+0

我不完全確定,但由於雙精度問題,這可能會倒下。如果d = 10.0,那麼實際的二進制表示將接近但不完全是10.如果表示實際上剛好低於10,那麼底層操作可能將其拉低至9並失敗。它也可能會因負數而失敗。 –

+0

@TimB - 你能舉出一個可能失敗的例子。如果需要,我很樂意在此基礎上進行修改並修復答案! :) – SudoRahul

+0

據我所知,它的浮點不準確性可能會降低以及升高。這意味着如果你(例如)輸入了10.0,你實際上可能會以9.999999999999999999999999999999764(例如挑選的隨機數)結束。這意味着Math.floor(10.0)會返回(9.0),除非Math.floor()中有特殊的邏輯來檢測這些情況。我不確定它是否可以。 –

2

這可能就像這樣:

double d = 3.0; 
System.out.println("Ends with a '.0': " + ((d * 10) % 10 == 0)); 

如果要設置的值是這樣的:

double d = 2.9999999999999999; 

設置一個斷點,在這條線,跨過去,並尋找值爲d。您會意識到該值已經是3.0
因此,之後的任何轉換都將使用值3.0。 這就是爲什麼你不能避免使用雙變量這個問題。

+0

我認爲這是一個更好的解決方案,因爲它消除了雙精度問題並支持任意小數位數通過適當地改變* 10。 –

+0

老實說...這**不會**刪除雙精度......行爲是完全一樣的...... – bobbel

+0

是的,你可能需要在執行%10之前強制轉換爲整數 - 整數轉換將適當地加倍。 –

0
public static void main(String[]args) { 
    double d = 101.3; 
    d.toString().endsWith(".0") ? System.out.println("Ends with 0"): System.out.println("Not ends with 0"); 
} 
+0

不,這正是OP所做的(語法略有不同)! –

+0

d.toString()?不編譯 –

相關問題