我正在运行这段代码,循环似乎没有在指定的条件下停止。
for(double i=1.0; i!=2.0; i+=0.2){
System.out.println("The value of i :" +i);
}
这是Java中表示双数的方式的问题吗?
我正在运行这段代码,循环似乎没有在指定的条件下停止。
for(double i=1.0; i!=2.0; i+=0.2){
System.out.println("The value of i :" +i);
}
这是Java中表示双数的方式的问题吗?
这是一个相当普遍的问题:0.2
不能在 a 中精确表示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 是否相等时,您需要格外小心。
是的,就是这样 - 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