【问题标题】:difference between two conditions in a while loopwhile循环中两个条件之间的区别
【发布时间】:2017-11-01 19:15:01
【问题描述】:

我对我的代码有疑问。我知道我必须在我的代码中更改什么,但我想了解为什么会发生这种情况,因为我真的想学习基础知识。所以我的代码是:

public class chunnimunni {
    public static void main(String[] args) {
         double number = 2.0;
         while (true) {
             if (number == 0.5)
                 break;
             number -= 0.1;
             System.out.printf("%8.1f", number);
         }
         System.out.println ("Finished.");
    }
}

此代码将继续并无限期地打印出数字,它不会停止在 0.5。但是,如果我将 while 条件更改为:

while (true)

while (number > 0.5)

然后就可以了。

如果有人能解释原因,我会很高兴。谢谢。

【问题讨论】:

  • 而不是System.out.printf("%8.1f", number); 使用System.out.println(number);,你会看到number 持有的更精确的值,比如0.49999999999999933,它不等于0.5,所以if (number == 0.5) break; 永远不会发生。更多信息请访问Is floating point math broken?

标签: java while-loop conditional-statements


【解决方案1】:

浮点数缺乏精度,因此进行if (number == 0.5) 之类的比较通常不会按预期工作。

相反,我认为你想要if (number <= 0.5) break

如果你真的想在浮点数上做相等,那么你应该取一个差异并与一个小的数字进行比较。例如,

if (Math.abs(number - 0.5) < 1E-9)

【讨论】:

  • 是的,我知道这一点。这就是为什么我有 printf 条件,所以它只打印出一位小数。但这不是问题,问题是关于 while 循环中的真实陈述。
  • 那你不知道,因为同样的规则适用于你的情况。
  • @mackanmorre:printf 无关紧要;你还在比较浮点值。除非您将其与某种 epsilon 值进行比较(即,减去该值并将其保留在您期望的小数位数之内),否则您可能会永远陷入一个不是 的值的循环中相当 0.5。
  • @mackanmorre,while 循环中的true 语句只会导致循环永远持续下去,除非有break。由于if 检查失败,中断将永远不会发生,循环将永远继续。
  • 谢谢@merlin2011,这就是我一直在寻找的答案:)
猜你喜欢
  • 2011-04-07
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
相关资源
最近更新 更多