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类型不能直接比较大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值