这个循环总会破裂 - 双重比较

时间:2014-03-12 05:58:07

标签: java double

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的差异。循环总是会破坏吗?

2 个答案:

答案 0 :(得分:0)

原因是...... 首先difference将是&gt;每doubletwo >而不是1

所以值doubleOne 在每次迭代中都会增加一个

经过几次迭代后,doubleOne的值将为>而不是doubleTwo

因此,difference<而不是1 doubleOne + difference会将doubleOnedoubleTwo的值设置为相等。 并且循环中断。

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