コンピュータアルゴリズム、floatとdoubleの違いは?

パッケージ_02操作;

パブリッククラス_Test {

public static void main(String[] args) {

		// 低精度向高精度自动类型转换
		double x = 0.3;
		System.out.println("x的值为:"+x);
		System.out.println("x等于0.3吗?:"+(x==0.3));
		System.out.println("x大于0.3吗?:"+(x>0.3));
		System.out.println("x小于0.3吗?:"+(x<0.3));
		// 不经历类型转换
		double y = 0.3D;
		System.err.println("y的值为:"+x);
		System.err.println("y等于0.3吗?:"+(x==0.3));
		System.err.println("y大于0.3吗?:"+(x>0.3));
		System.err.println("y小于0.3吗?:"+(x<0.3));
		
		// 高精度向低精度转换 
		float z = (float)1.2;
		System.out.println("z的值为:"+z);
		System.out.println("z等于1.2吗?:"+(z==1.2));
		System.out.println("z大于1.2吗?:"+(z>1.2));
		System.out.println("x小于1.2吗?:"+(z<1.2));
		// 那么问题来了?为什么a会大于1.2呢?
		// 说明在强制类型转换的时候,丢视了精度;
		// 按这个情况来讲,提出猜想它可能是进位了;
		
		// 我们进行如下操作,验证猜想:
		float a = (float)1.1234561723;
		float aplus = (float)1.1234561823;
		float b = (float)1.1234562323;

// float c =(float)1.1234563523;
float d =(float)1.1234565123;
float k =(float)1.1234564123;
float e =(float)1.1234565923;
float f =(float)1.1234566423;
float g =(float)1.1234567823;
float h =(float)1.1234569923;
// float i =(float)1.1234569123;
// float j =(float)1.1239999523;
float q =(float)1.12345677;

		System.err.println("a的值为:"+a);
		System.err.println("b的值为:"+b);

// System.err.println( "The value of c:" + c);
System.out.println( "The value of d:" + d);
System.out.println( "The value of k:" + k);
System.out.println( "eの値:" + e);
System.out.println( "fの値:" + f);
System.out.println( "gの値:" + g);
System.out.println( "The value of h:" + h);
// System.out.println( "The value of i:" + i);
// System.out.println( "j値は次のとおりです: "+ j);
System.err.println(" qの値は次のとおりです: "+ q);

		// 上述实验证明:在这里float的有效位数是7;
		//  决定数值是否进位的,也是第7位上的数决定的;
		//  实验发现:当第七位为3的时候,自身会增1,直接变成4;
		//  					   当第七位为9的时候,自身会增1,直接向前进位,输出;
		// 当第七位为1时:第八位小于或等于7的时候,自身不变;
		// 当第七位为2时:第八位无论为何值,自身不变;
		// 当第七位为4时:第八位为1,自身不变;其他都增1;
		// 当第七位为5时:第八位为小于等于3的数,自身不变;大于3的数,自身增1;
		// 当第七位为6时:第八位为小于等于4的数,自身不变;大于4的数,自身增1;
		// 当第七位为7时:第八位为小于8的数,自身不变;大于等于8的数,自身增1;
		// 当第七位为8时:第八位无论为何值,自身不变;
		
		// 进行比较
		System.err.println("a判断等于:"+(a==1.1234561523));
		System.err.println("a判断大于:"+(a>1.1234561523));
		System.err.println("a判断小于:"+(a<1.1234561523));
		
		System.err.println("aplus的值为:"+aplus);
		System.err.println("aplus判断等于:"+(aplus==1.1234561523));
		System.err.println("aplus判断大于:"+(aplus>1.1234561523));
		System.err.println("aplus判断小于:"+(aplus<1.1234561523));
		
		System.err.println("q判断等于:"+(q>1.1234567));
		
		// 经过实验证明:由于高精度向低精度进行强制类型转换,丢失精度的同时;
		// 为了确保数值的更接近原来的值,采用了一定的方法进行进位处理。
		// 由于进位的差异,可能导致两种情况:
		// ① 最高精度位比原来的数值要大1,因此出现float型数比double型数大的情况;
		// ② 最高精度位没有达到进位的条件,因此直接舍弃了之后的更高精度位的数值,导致float型数值比double类型数值小的情况;
		// ③ 实验发现,当两数相同时,先进行了强制类型转换的始终要比后来的那个大;
		
		// 结论:这里可以粗略的得出,由于存在某个进位条件,double型值向float型值强制转换,会出现转换后的数,比原来的数大
		// 或者小的情况;但是当两数相同时,先进行了强制类型转换的要比后来比较的那个大;
		
		// float 单精度浮点数   double双精度浮点数
		/**
		 * 二者的区别:
		 * 		①在内存中占有的字节数不同;
		 * 		double:8字节;float:4字节;
		 * 		②有效数字位数不同(据说这个不同的编译器规定不同,我也不知道是如何决定的);
		 * 		我用的eclipse,java语言,double是16位,float是7位;
		 * 		③数值的取值范围不同;
		 * 		double 64位  1位符号位,11位指数位,52位尾数位;
		 * 		float      32位  1位符号位, 8  位指数位,23位尾数位;
		 * 		指数位决定了取值范围;double:-1.7E-308~1.7E+308     float:-3.4E-38~3.4E+38		
		 * 		位数位决定了精度;
		 */
		
		// 若想正确的判断数值的大小,就必须了解浮点数是如何存储进计算机的;
		// 以及浮点数在计算机中进位机制,内部运行逻辑;
		
}

}
実行結果
xは1.2未満ですか?:False aの値
:1.1234561
bの値:1.1234562
dの値
:1.1234565 k
の値:1.1234564 e
の値:1.1234566 f
の値:1.1234566 g
の値:1.1234568 hの値:1.123457
qの値は次のとおりです。1.1234567
判定が等しい:false
判定が大きい:false
判定が小さい:true
aplusの値
が等しい:1.1234562 aplus判定が等しい:false
aplus判定が大きい:true
aplus判断が以下である:false
q判断が等しい:true

おすすめ

転載: blog.csdn.net/MIRACLE_Ying/article/details/113485827