Java中double或者float类型的数据精度问题

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相比较即可。
此时输出的结果已经正常了:
在这里插入图片描述

参考博客:
C/C++ 浮点数存储
c++Double类型不能直接比较大小

猜你喜欢

转载自blog.csdn.net/sinat_38848255/article/details/107668906
今日推荐