【问题标题】:Why would you use double variables at all in a for-loop [closed]为什么要在 for 循环中使用双变量 [关闭]
【发布时间】:2013-06-28 21:28:25
【问题描述】:

我正在阅读以下代码(在 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 相关

【问题讨论】:

  • 为什么不呢?如果您已经在处理 double 值(或创建玩具示例),那是有道理的。
  • 为什么要在 for 循环中使用双精度数?
  • 看起来上下文实际上是继承,而不是数字,所以可能是为了让代码更透明。
  • for(double d = 0; d&lt;array.length; d++) { array[d] = d; }
  • @SamIam:那不会编译。

标签: java double


【解决方案1】:

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

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

【讨论】:

  • 当然,老程序员(与大胆的程序员相反)从不使用== 来终止甚至是整数索引的循环,经常被奇怪的错误所困扰,这些错误会导致增加超过停止点。
  • @HotLicks 说句公道话,我一直被教导说,如果你要失败……要大声地大声失败,这样你才能在投入生产之前找出错误。哈哈。至少你不会像一个奇怪的递增值那样错过无限循环?
  • 您显然从未在输出窗口收到过两盒打印输出,每行都带有一个不断递增的数字。
  • 嗯。触摸,先生。触摸。
【解决方案2】:

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


比如这个循环

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

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

【讨论】:

【解决方案3】:

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

【讨论】:

  • 你只是想确保你不使用==作为终止条件。
  • 你真的不应该首先使用== 来比较双精度数。
  • @HotLicks 哈哈,我去为这个效果添加一个答案,发现你已经发表了评论。 -_- 失败。
【解决方案4】:

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

【讨论】:

【解决方案5】:

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

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多