2017-05-31 369 views
2

我有一个关于我的代码的问题。我知道我需要在代码中改变什么,但是我想明白为什么会发生这种情况,因为我真的想学习基础知识。所以我的代码是:while while循环中两个条件之间的区别

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 (true) 

while (number > 0.5) 

然后它工作。

如果有人能解释这个原因,我会非常高兴。谢谢。

+1

而不是'System.out.printf(“%8.1f”,number);''使用'System.out.println(number);'你会看到更精确的值被'号码'0.49999999999999933'不等于'0.5'所以'if(number == 0.5)break;'永远不会发生。更多在此[在浮点数学是否坏了?](https://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Pshemo

回答

6

浮点数缺少精度,因此做比较如if (number == 0.5)通常不会按预期工作。我想你想要if (number <= 0.5) break

如果你真的想在浮点数上做平等,那么你应该有所作为,并与小数进行比较。例如,

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

是的,我知道这一点。这就是为什么我有printf条件,所以它只打印出一位小数。这不是问题,但问题是关于while循环中的真实语句。 – mackanmorre

+0

然后你不知道这一点,因为相同的规则适用于你的情况。 – sturcotte06

+2

@mackanmorre:printf不重要;你还在比较浮点值。除非你将它与某种epsilon值进行比较(也就是说,减去该值并将其与预期的小数位数相比较),否则您可能会永久停留在一个循环中,其值不是*完全相同* 0.5。 – Makoto