我有一些雙數如:3.0
3.1
4.0
5.2
等等。如何判斷一個雙數以.0結尾的Java
我可以判斷數字是否以.0
結尾,如3.0
和4.0
?
有沒有最好的方法來做到這一點?
PS:我將它們轉換爲字符串類型,但我認爲這不是最好的方法。
double i = 3.0;
String d = i + "";
return d.endsWith(".0");
我有一些雙數如:3.0
3.1
4.0
5.2
等等。如何判斷一個雙數以.0結尾的Java
我可以判斷數字是否以.0
結尾,如3.0
和4.0
?
有沒有最好的方法來做到這一點?
PS:我將它們轉換爲字符串類型,但我認爲這不是最好的方法。
double i = 3.0;
String d = i + "";
return d.endsWith(".0");
你可以做這樣的事情。
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)。
我不完全確定,但由於雙精度問題,這可能會倒下。如果d = 10.0,那麼實際的二進制表示將接近但不完全是10.如果表示實際上剛好低於10,那麼底層操作可能將其拉低至9並失敗。它也可能會因負數而失敗。 –
@TimB - 你能舉出一個可能失敗的例子。如果需要,我很樂意在此基礎上進行修改並修復答案! :) – SudoRahul
據我所知,它的浮點不準確性可能會降低以及升高。這意味着如果你(例如)輸入了10.0,你實際上可能會以9.999999999999999999999999999999764(例如挑選的隨機數)結束。這意味着Math.floor(10.0)會返回(9.0),除非Math.floor()中有特殊的邏輯來檢測這些情況。我不確定它是否可以。 –
這可能就像這樣:
double d = 3.0;
System.out.println("Ends with a '.0': " + ((d * 10) % 10 == 0));
如果要設置的值是這樣的:
double d = 2.9999999999999999;
設置一個斷點,在這條線,跨過去,並尋找值爲d
。您會意識到該值已經是3.0
。
因此,之後的任何轉換都將使用值3.0
。 這就是爲什麼你不能避免使用雙變量這個問題。
我認爲這是一個更好的解決方案,因爲它消除了雙精度問題並支持任意小數位數通過適當地改變* 10。 –
老實說...這**不會**刪除雙精度......行爲是完全一樣的...... – bobbel
是的,你可能需要在執行%10之前強制轉換爲整數 - 整數轉換將適當地加倍。 –
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");
}
不,這正是OP所做的(語法略有不同)! –
d.toString()?不編譯 –
那麼你會考慮3.0001與「0」或「1」結束嗎? (十進制數字「在某處結束」的概念本質上是有問題的) –
@GyroGearless有道理。我沒有想到這麼遠 –