float精度问题引发的神奇结果

public class Main3 {
	
	public static void main(String[] args) {
		int x=33;		
		int x2=33333333;//八位的十进制数,33333333实际上即使是整数无法被float表示的,float能确保7位数的整数被精确表示
		int x4=33333334;
		float y=1f;
		
		//x2转float存储时有效数位只有23位,最多存储有效数24位(默认第一位是1),故x2的有效数位存储为:11111100101000000101010 
		//可以看到最后一位被切没了,事实上x2也就变成了33333332,其实float永远无法表示33333333,但是可以表示33333334(因为+1发生了进位)
		System.out.println((int)(float)x2);
		System.out.println((int)(float)x4);
		
		x=(int)(x+y);//先会将x转为float,发生精度丢失变成33333332,即使在加上y但由于无法表示33333333又变成了33333332
		System.out.println(x);
		x2=(int)(x2+y);
		System.out.println(x2);
    }

}

运行结果

33333332
33333334
34
33333332

刚开始看到这个结果的时候惊呆了,好恐怖。后面百度了下float有效表示的10进制整数是7位,这里八位了,以后注意就行。
解释已经在注释中给出,关于11111100101000000101010怎么来的看这篇博文:
https://blog.csdn.net/qq_22771739/article/details/86062918

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值