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