public void testLoop(double doubleTwo) {
double doubleOne = 0;
while (true) {
if (doubleOne == doubleTwo)
break;
double difference = doubleTwo - doubleOne;
if (difference < 1)
doubleOne = doubleOne + difference;
else
doubleOne = doubleOne + 1.0;
}
}
我关注双重比较。但是代码增加了epsilon的差异。循环总是会破坏吗?
答案 0 :(得分:0)
原因是......
首先difference
将是&gt;每doubletwo
>
而不是1
。
所以值doubleOne
在每次迭代中都会增加一个。
经过几次迭代后,doubleOne
的值将为>
而不是doubleTwo
。
因此,difference
将<
而不是1
doubleOne
+ difference
会将doubleOne
和doubleTwo
的值设置为相等。
并且循环中断。
当doubleTwo
小于1时,difference
被添加到0
,当然数字也相等。
这就是每次循环退出的原因。
答案 1 :(得分:0)
我在这个循环中看到的问题是,&#34; double == double&#34;用来。
由于双精度在每个定义中都是不精确的,因此测试像if (doubleOne - doubleTwo <= 0.00001)
这样的特定增量会更安全。
我个人比较双打以确定它们是否真的相同的方式是
public static boolean equals (final double aObj1, final double aObj2)
{
return (aObj1 == aObj2) || (Double.doubleToLongBits (aObj1) == Double.doubleToLongBits (aObj2));
}
HTH