Java中double或者float类型的数据精度问题
今天在编程进行一项测试的时候,需要用到double类型的数据做一个for循环,需要定义一个double类型的数据i从0自增到1,幅度为0.05。在使用时发现这个数据没有办法加到1,经过输出找到了问题代码如下:
@Test
public void test10() throws Exception {
double i = 0.0;
for(;i <= 1.0;i += 0.05) {
System.out.println(i);
}
}
输出的结果如下:
可以发现经过计算得到中间过程的i值并不是我们所想的精确的双精度小数,而是一个近似值,所以在最后的判断条件i <=1 时此时的i值已经大于1了,经输出发现,这个值为:
因此进不去循环,导致循环过程不完整。经过查资料发现这是由于double类型(或者float类型)数据的精度所导致的。
解决办法:
在进行浮点数的比较时不能进行直接的比较,而应该与一个很小的数做一个加法(或减法)来进行比较。具体的做法如下:
@Test
public void test10() throws Exception {
final double eps=1e-6;
double i = 0.0;
for(;i <= (1.0 + eps);i += 0.05) {
System.out.println(i);
}
}
就是设置一个很小的值,一般取1e-6就足够了。然后在double类型的数据进行比较时,让这个数据与结束条件+1e-6相比较即可。
此时输出的结果已经正常了: