我正在阅读以下代码(第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
相关的内容答案 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
的值,只会留下一个循环条件永远是真的,你将陷入困境。
请勿使用不精确的数据(例如float
和double
)来控制程序的流程。
相反,您应该使用整数(例如从0
包含到n
不等)来控制循环。有几种方法可以做到(当处理舍入错误时,大多数方法都是错误的),但至少你可以确定你的循环会终止。
关于invoke
的问题:我认为f
是Method
而不是Field
。 java.lang.reflect
是reflection的一组类。使用反射,程序员使它成为f
指向方法,并且invoke
可用于调用该方法。由于它是以null
作为第一个参数调用的(通常会指定this
是什么),f
必须引用某些静态方法才能成功