0

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

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有关

4

5 回答 5

4

这样做非常好,特别是如果您想循环小数值或按小数值递增。

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

于 2013-06-28T21:33:39.977 回答
4

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


例如,这个循环

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

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

于 2013-06-28T21:36:42.130 回答
1

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

于 2013-06-28T21:30:21.457 回答
1

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

于 2013-06-28T21:31:13.467 回答
1

这是一个非常糟糕的主意。对于大n(相对于to - from),dx将非常小以至于x += dx不会改变 的值x,给您留下一个始终为真的循环条件,您将被困在循环中。

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

相反,您应该使用一个整数(例如从0包含到n排除)来控制循环。有几种方法可以做到这一点(其中大多数在处理舍入错误时都是错误的),但至少您可以确定您的循环将终止。


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

于 2013-06-28T22:45:22.577 回答