Java 循环通过具有步长的点,包括终点

Java 循环通过具有步长的点,包括终点,java,Java,我有一个起点和终点,我想使用特定的步长循环它们,但我需要确保包括终点。以下是实现这一目标的最佳方法,还是有更好的方法 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;

我有一个起点和终点,我想使用特定的步长循环它们,但我需要确保包括终点。以下是实现这一目标的最佳方法,还是有更好的方法

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;
    }
}
双启动=2.1;
双端=5.3;
双台阶=0.6;
for(双i=开始;i结束){
i=结束;
}
}

通常,循环变量应该使用整数,尤其是当间隔除以整步数时。如果这是不可能的,您可以使用双值,但您需要小心避免双计算的精度陷阱

比较双打是否相等不是一个好主意。更好的方法是使用Math.min将i限制在end的值:

for(double i = start; i < end+step; i += step) {
    double pt = Math.min(end, i);
    ... // use pt here
}
for(双i=开始;i<结束+步骤;i+=步骤){
双pt=数学最小值(结束,i);
…//在这里使用pt
}

您可以使用循环外的指令来完成
结束部分。
不要在迭代中使用
double
。由于浮点数的存储方式,例如,您可以将
2.1+0.6
设置为
2.7
,但
设置为2.69999999999999
。在这种情况下,乘以10得到您想要的结果

你的解决方案是错误的。您使i=end,但它随后被逐步添加,因此您不需要迭代。您可以使用:

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

您可以计算所需的整数步数,并使用它们来控制循环。当到达最后一步时,使用
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;
    }
}
请注意,对于中间步骤,我们使用乘法而不是重复加法来计算位置。我目前找不到引用,但我的理解是,这会导致更少的浮点“漂移”。这似乎得到了证实。如果我们使用:

pos = (s==steps) ? end : pos+step;
要计算下一个
pos
,我们得到如下输出:

2.1
2.7
3.3000000000000003
3.9000000000000004
4.5
5.1
5.3

我将乘以10,在这里使用int,你可能会得到一些带double的舍入问题。这不是另一个问题的重复,OP做了同样的事情,但他想要一个不同的结果。@dasblinkenlight我不同意你的观点,OP想要一个包含end的循环在这里其实并不重要。
@RC。OP对双值有一个相等检查,这是一个很大的禁忌。在你的解决方案中,i总是小于end。@KristjanKica不是真的,请看停止条件。你需要这样做
for(双i=start;i<=end+step;i+=step){double pt=Math.min(end,i);…//在这里使用pt}
2.1
2.7
3.3000000000000003
3.9000000000000004
4.5
5.1
5.3