2017-05-05 2507 views
1

我想知道如何使for loop變量,而不是int變量。 我試過的東西只產生了一個double,但它基本上是一個int,每個數字後面都有一個「.0」 。如何在for循環中使用double而不是int?

代碼:

public static void FindTheDouble() { 

    double LookFor = 2.29195; 
          //also tried adding a ".xxx" here 
    for (double i = 1; i <= 5; i++) { //notice i is of type double 
     System.out.println(i); 
     if (i == LookFor) { 
      System.out.println(); 
      System.out.println("Found the double: "+LookFor); 
      break;   
     } 
    } 
} 

輸出:

1.0 
2.0 
3.0 
4.0 
5.0 

編輯:對不起,忘了說什麼,我一直在尋找。我一直在尋找它通過「.xxxxxxx」,但只是得到了輸出。

而且這是使用break語句的正確方法嗎?任何幫助表示感謝,提前致謝!

+1

在你的for循環中,你可以用你想要的任何東西替換i ++。如果因某些原因想要小數位,i + = 0.1345。您正確使用break語句。 – mba12

+1

目前還不清楚「爲循環加雙」意味着什麼。你爲什麼期望這些值不是1,2,3,4,5? – VGR

+2

可以用'Math.ulp'或'Double.longBitsToDouble'從字面上遍歷每個可能的'double'值,但這需要很長時間,我不禁想到必須有更好的方法去做什麼你想要做的。也許如果你告訴我們更多關於你想達到的目標,我們可以提出一個更好的方法。 – Radiodef

回答

0

你可以做這樣的事情:

public static void FindTheDouble() { 

double LookFor = 2.29195; 

for (double i = 1.0; i <= 5.0; i+=0.00005) { 
    System.out.println(i); 
     if (i == LookFor) { 
      System.out.println(); 
      System.out.println("Found the double: "+LookFor); 
      break;   
     } 
    } 
} 

你break語句是正確的。

您的平等聲明可能會因雙打而失敗。相反,你想要做這樣的事情:

if (Math.abs((i - LookFor)) < 0.0000001) 

雙可擴展的小數位,可與你平等的比較成功的干擾有多餘的值。相反,最好檢查兩個雙精度值是否在某種程度的精度之內,這對您而言是可以接受的。

+5

請注意多個增量到浮點的缺陷。 – Bathsheba

+1

好的,謝謝。我會試試這個。 – StarCoder

0

您可以使用Math.floor(i * 100000)/100000只檢查與部分

double LookFor = 2.29195; 

for (double i = 1.0; i <= 5.0; i += 0.00005) { 
    System.out.println(i); 
    if ((Math.floor(i * 100000)/100000) == LookFor) { 
     System.out.println(); 
     System.out.println("Found the double: " + LookFor); 
     break; 
    } 
} 

的理念是:

不要測試了所有你要只有exacte一部分,所以Math.floor(2.29195000000143 * 100000)/100000 = 2.29195,爲雙2.29195000000143你不會進入你的條件,因爲你像這樣測試:

2.29195000000143 == 2.29195,這會給你錯誤的結果。

+0

這不是我正在尋找的。謝謝你。 – StarCoder

+0

檢查我的編輯@StarCoder –

+0

我會嘗試一下,我不太瞭解java,所以感謝您的幫助。 – StarCoder

1

放心i一個double,但i永遠不會2.29195

for循環中使用double需要認真考慮,因爲重複向浮點添加常數可能導致累積總數由於從十進制到二進制的不精確轉換而導致「關閉」。 (嘗試用i += 0.1作爲增量並親自查看)。但是對於小數字來說,你會很好,但是當然使用double當然毫無意義。

如果你想通過0.00001單位有效計數,然後使用類似

for (int i = 100000; i <= 500000; ++i){ 
    double f = i * 0.00001; 
} 

然後f是接近,你真的想爲IEEE754 double允許的數量。

+0

好的,謝謝。我會嘗試,並會考慮到這一點。 – StarCoder

+0

只是好奇@Bathsheba'double f = i * 0.00001;'和我頂層'(雙)i'的解決方案有什麼區別? –

+0

在我的例子中,'i'是一個'int',乘以'0.00001'不僅可以將'i'提升爲'double',而且還可以縮放增量。 – Bathsheba

0

你想走你的雙號每0.000001直到找到2.29195,只需在每個互動增加0.000001我:

double LookFor = 2.29195; 

    for (double i = 1; i <= 5; i += 0.00001) { 
     System.out.println(i); 
     if (i == LookFor) { 
      System.out.println(); 
      System.out.println("Found the double: "+LookFor); 
      break;   
     } 
    } 
} 

不知道你想什麼來實現的,而不是使用break悠雲使用while子句:

double LookFor = 2.29195; 
double i = 1; 
while(i != LookFor && i <= 5){ 
    System.out.println(i); 
    i += 0.00001; 
} 
System.out.println("Found the double: "+LookFor); 

最後,考慮用戶BigDecimal而不是雙防止漂移浮動的問題。

+5

請注意多個增量到浮點的缺陷。 – Bathsheba

+0

是的,我想讓它「走」「規模」。我會嘗試的。 – StarCoder

+2

如果要實施,請爲每個新值「i」取出System.out.println(i)。它會將控制檯垃圾郵件。也許只能間隔打印,比如當你達到1.0,2.0,3.0等時 – Oskarzito

0

關於你的問題的最後部分,break語句終止最近的循環。例如,檢查代碼段如下:上述

for(int i = 0; i < whatever; i++){ 
    for(int j = 4; j > 0; j--){ 
     if(i == j){ 
      break; 
      } 
     } //End of second for-loop 
    } //End of first for-loop 

在代碼break語句終止第二for循環只。您可以通過使用標籤來選擇哪個特定的循環中斷語句會中斷。假設我其實是想break語句結束第一圈,我只是貼標籤於它,如:

here: 
for(int i = 0; i < whatever; i++){ 
    for(int j = 4; j > 0; j--){ 
     if(i == j){ 
      break here; 
      } 
     } //End of second for-loop 
    } //End of first for-loop 

注意:您可以使用任何你想要的標籤的任何話。你可以用任何單詞替換'here',當然除了關鍵字。

+0

哦,好的,謝謝! – StarCoder

+0

Mhmmmm ......這裏有什麼用處:'我不明白。有人可以啓示我嗎?謝謝! – StarCoder

+0

我在這裏用作標籤(或者更好,就像一個標記)。所以,如果我在這裏輸入break,那麼距離聲明(這裏)最近的循環將被終止;在這種情況下,它是循環的第一個。 – Taslim

0

如果你不介意使用DoubleStreamJava 8,你可以嘗試這樣的事情,但請考慮以下幾點:

  • 最大。小數點後7位數字(我還沒有測試過)
  • 你想要的精度越高,需要的時間越多。
  • 如果提供(即步驟)的精度比目標一倍,你正在尋找少 - >它不會找到它(正常的邏輯)。

    import java.text.DecimalFormat; 
    import java.util.stream.DoubleStream; 
    
    public class DoubleSearch { 
    
    public static void main(String[] args){ 
        //Testing 
        System.out.println(search(0.0000001, 5, 0.1)); // true 
        System.out.println(search(0.0000001, 4, 0.01)); // true 
        System.out.println(search(0.0000001, 3, 0.001)); //true 
        System.out.println(search(0.0000001, 0.5, 0.0001)); //true 
        System.out.println(search(0.0000001, 1.1, 0.00001)); //true 
        System.out.println(search(0.0000001, 5.25, 0.0000001)); //true 
        System.out.println(search(0.0000001, 2, 1.0001)); 
        System.out.println(search(0.1, 5, 4.0001)); // false because no enough precision provided (0.1) 
        System.out.println(search(0.1, 2, 3)); // false as it's out of range 
        System.out.println(search(0.00001, 5, 2.29195)); // your example returns true (i.e found) 
    } 
    
    public static boolean search(double step, double max, double target){ 
        return DoubleStream.iterate(0, d-> d+step).limit((long)(max/step)).anyMatch(p-> 
            Double.compare(Double.valueOf(new DecimalFormat("#.#######").format(p)), 
            Double.valueOf(new DecimalFormat("#.#######").format(target)))==0); 
    } 
    
    } 
    

輸出:

true 
true 
true 
true 
true 
true 
true 
false 
false 
true 
+0

我不認爲我會介意,但我不明白建議的代碼。當然,我注意到'System.out.println'和''方法'。但我不明白你在做什麼。謝謝您的幫助! – StarCoder

0

現在,檢查下面的代碼片斷:

action: 
//loop 1 
for(int i = 0; i < 10; i++){ 
    //loop 2 
    for(int j = 0; j < 10; j++){ 
     if(i == (j - 2)){ 
      break action; 
       } 
     } 
    } 

在上面的代碼中,如果在內部的for循環的條件遇到第一個循環會因標籤聲明而中斷(操作:)就在第一個循環之前。

現在,看看這個:

//loop 1 
for(int i = 0; i < 10; i++){ 
    //loop 2 
    action: 
    for(int j = 0; j < 10; j++){ 
     if(i == (j - 2)){ 
      break action; 
       } 
     } 
    } 

顯然,在這種情況下,它的第二循環,如果條件得到滿足的是會被打破。

最後,標籤沒有固定的關鍵字,你可以使用任何你喜歡的名字(雷霆,火,超人,任何東西),你也可以在你的代碼中聲明多個標識符。我希望這有助於......快樂編碼!

+0

哦,好的,謝謝! – StarCoder

相關問題