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

猜你喜欢

转载自blog.csdn.net/qq_22771739/article/details/86062898
今日推荐