パッケージ_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