我正在運行此代碼,循環似乎沒有停止在指定的條件下。即使條件滿足後,for循環仍然繼續執行
for(double i=1.0; i!=2.0; i+=0.2){
System.out.println("The value of i :" +i);
}
這是雙數在Java中表示方式的問題嗎?
我正在運行此代碼,循環似乎沒有停止在指定的條件下。即使條件滿足後,for循環仍然繼續執行
for(double i=1.0; i!=2.0; i+=0.2){
System.out.println("The value of i :" +i);
}
這是雙數在Java中表示方式的問題嗎?
這是一個相當普遍的問題:0.2
不能在一個double
精確表示,所以2.0
不等於10 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
的平等或不平等時,你需要非常謹慎。
實際上2之前的最後一個值大約是1.999。 。 。下一個值是2.1999。 。 。所以它永遠不會是2.0。 最好避免使用浮點數進行比較?像dasblinkenlight說的 – 2013-03-07 14:21:09
,用< or >代替直接比較。對於循環來說,這通常是一個好主意 – 2013-03-07 14:22:07
@JeffHawthorne我不一定會把它推廣到基於整數的條件循環:贊成使用'!='的論據是這樣一個循環的後置條件更強,使您的程序更容易正式分析。 – dasblinkenlight 2013-03-07 14:24:31
是的就是這樣 - 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的精確表示+ +1注意不要讓我的Eclipse崩潰,當我嘗試它:) – cowls 2013-03-07 14:20:13
'這是雙數字在Java中表示方式的問題嗎?'確切地說,浮點數的二進制表示是原因。這是你應該聰明地解決的問題:'for(double i = 1.0; i <= 2.0; i + = 0.2){'儘管[我的答案在這裏](http://stackoverflow.com/a/13513206/1667004 )是C,對於Java也是一樣的餡餅...... – ppeterka 2013-03-07 14:17:44