2017-09-01 47 views
2

我有一個開始點和結束點,我想用特定的步長循環它們,但我需要確保包含終點。下面是實現這一目標的最佳方式,還是有更好的方法?以步長循環點,包括終點

Double start = 2.1; 
Double end = 5.3; 
Double step = 0.6; 
for(Double i = start; i <= end; i += step) { 
    // do stuff 

    if(i != end && (i + step) > end) { 
     i = end; 
    } 
} 
+0

我會通過10和使用int繁衍在這裏,你可以與雙打 – 2017-09-01 17:12:23

+0

這部分四捨五入問題結束不是另一個問題的重複,OP做同樣的事情,但他想要一個不同的結果。 – dasblinkenlight

+1

@dasblinkenlight我不同意你的看法,OP想要一個包含end的循環的事實在這裏並不重要,它是'<'vs'<=' – 2017-09-01 17:23:23

回答

1

一般來說,你應該更喜歡整數爲你的循環變量,尤其是當間隔的步驟的整數分。如果這是不可能的,你可以使用double值,但是你需要小心以避免雙重計算的精度缺陷。

比較平等的雙打不是一個好主意。更好的方法是使用Math.min月底的價值封頂我:

for(double i = start; i < end+step; i += step) { 
    double pt = Math.min(end, i); 
    ... // use pt here 
} 
+0

在你的解決方案中,我總是少於結束。 –

+0

@KristjanKica不是真的,看到停止條件。 – dasblinkenlight

+0

你需要這樣做;對於(double i = start; i <= end + step; i + = step){ double pt = Math.min(end,i); ... //在這裏使用點 } –

3

可以使用的指令外循環,做end部分。 不要在迭代中使用double。由於存儲了浮點數的方式,因此您可以將2.1 +0.6設置爲2.7,但是例如as 2.69999999999999999999。在這種情況下,乘以10來實現你想要的。

您的解決方案有誤。你讓我=結束,但它然後逐步添加,所以你不迭代。你可以使用:

if(i != end && (i + step) > end) { 
     i = end-step; 
    } 
0

可以計算所需的整步數,並利用這些來控制循環。當你到達最後一步時,你使用end值。

public static void main(String[] args) 
{ 
    Double start = 2.1; 
    Double end = 5.3; 
    Double step = 0.6; 

    int steps = (int)Math.round((end-start)/step);  
    if(start + steps*step < end) steps++; 

    double pos = start; 
    for(int s=0; s<=steps;) 
    { 
     System.out.println(pos);    
     s += 1; 
     pos = (s==steps) ? end : start + step*s; 
    } 
} 

輸出:

2.1 
2.7 
3.3 
3.9 
4.5 
5.1 
5.3 

注意,對於中間步驟,我們使用乘法,而不是重複加入計算位置。目前我找不到一個參考,但我的理解是這會導致浮點「漂移」較少。這似乎證明了這一點。如果我們使用:

pos = (s==steps) ? end : pos+step; 

計算下一個pos那麼我們得到的輸出:

2.1 
2.7 
3.3000000000000003 
3.9000000000000004 
4.5 
5.1 
5.3