为什么你会在for循环中使用双变量

时间:2013-06-28 21:28:26

标签: java double

我正在阅读以下代码(第5章,继承,Horstman的核心Java):

double dx = (to - from) / (n-1);

for (double x = from; x <= to; x += dx)
{
  double y = (Double) f.invoke(null, x);
  System.out.printf(%10.4f |  %10.4f%n" + y, x, y);
}

为什么你会在for循环中使用双变量?什么是invoke用于?感谢

编辑:f是与Field

相关的内容

5 个答案:

答案 0 :(得分:4)

完全没问题,特别是如果你想循环小数值或按小数值递增。

但是我只是想在其他答案中添加一些内容,即如果你采用这种技术,那么==进行比较以获得结束循环的条件。由于精度误差,尽管有最好的意图,但这很容易导致无限循环。这就是为什么您的图书代码使用<=

答案 1 :(得分:4)

将浮点值用作for循环变量并不是一个好主意,因为算术和比较的细微之处。由于舍入错误,您的循环可能无法遍历您期望的值。可能出现一个错误。


例如,这个循环

 for (double x=0.0; x < 100.0; x += 0.1)

可能会通过值0.0,0.1,0.2,......但由于舍入误差会传递略微不同的值。

答案 2 :(得分:1)

例如,如果要以0.11为增量从1.5上升到不超过8,则在for循环中需要双变量。

答案 3 :(得分:1)

没有理由不这样做。通常你用整数循环,但没有理由你不能做同样的事情,双重应用任意指令到循环迭代的结束,如x = x * 1.2或类似的东西。我们还需要知道f是什么告诉你调用的作用;)

答案 4 :(得分:1)

这是一个非常糟糕的主意。对于较大的n(相对于to - from),dx会非常小,x += dx不会更改x的值,只会留下一个循环条件永远是真的,你将陷入困境。

请勿使用不精确的数据(例如floatdouble)来控制程序的流程。

相反,您应该使用整数(例如从0包含到n不等)来控制循环。有几种方法可以做到(当处理舍入错误时,大多数方法都是错误的),但至少你可以确定你的循环会终止。


关于invoke的问题:我认为fMethod而不是Fieldjava.lang.reflectreflection的一组类。使用反射,程序员使它成为f指向方法,并且invoke可用于调用该方法。由于它是以null作为第一个参数调用的(通常会指定this是什么),f 必须引用某些静态方法才能成功