即使在满足条件之后,for循环也继续执行Java

时间:2013-03-07 14:15:25

标签: java

我正在运行此代码,并且循环似乎没有在指定的条件下停止。

for(double i=1.0; i!=2.0; i+=0.2){
    System.out.println("The value of i :" +i);
}

这是用Java表示双号的方式的问题吗?

2 个答案:

答案 0 :(得分:7)

这是一个相当常见的问题:0.2无法在double中完全表示,因此2.0不等于加在一起的十0.2的总和。您需要使用<代替!=来停止循环。

请注意,你的循环适用于增量等于2的负幂,比如0.25:下面的循环工作正常,并按预期停止:

for(double i=1.0; i!=2.0; i+=0.25){
    System.out.println("The value of i :" +i);
}

这样可行,因为0.25可以完全用double表示。这个小实验表明,在比较double s的平等或不平等时,你需要非常谨慎。

答案 1 :(得分:2)

是的,它是 - 0.2不能完全表示为双。要查看确切的值,可以运行以下程序:

public static void main(String[] args) {
    for (double i = 1.0; i != 2.0 && i < 3.0; i += 0.2) {
        System.out.println("The value of i :" + new BigDecimal(i));
    }
}

打印:

The value of i :1
The value of i :1.1999999999999999555910790149937383830547332763671875
The value of i :1.399999999999999911182158029987476766109466552734375
The value of i :1.5999999999999998667732370449812151491641998291015625
The value of i :1.79999999999999982236431605997495353221893310546875
The value of i :1.9999999999999997779553950749686919152736663818359375
The value of i :2.199999999999999733546474089962430298328399658203125
The value of i :2.399999999999999911182158029987476766109466552734375
The value of i :2.600000000000000088817841970012523233890533447265625
The value of i :2.800000000000000266453525910037569701671600341796875

您的选择:

  • 围绕数字
  • 使用i < 2.0条件(但您可能会错过一次迭代,具体取决于舍入)
  • 使用BigDecimal获得0.2
  • 的精确表示