关于float这道测试题
来源:1-3 Float在JVM的表达方式及使用陷阱
超人迪加123
2020-05-22 18:27:38
这道题有些地方不够清晰
float小数点后最多只能存7位?
float在内存中以科学计数法的形式存储?
那么float数值在运算时,是以数值的形式运算?,还是以科学计数法的形式运算的?
小数点后超出第7位的小数都会被忽略,即使有关于小数点后第7位的小数的运算也是直接忽略吗?
下面的float数值a在内存中以科学计数法的形式表示时,是如何将后面的23E8变成16E8的?
public void floatTest() {
float d1 = 423432423f;
System.out.println("d1:");
System.out.println(d1);
System.out.println("科学计数清表示:");
System.out.println("4.23432423E8");
System.out.println();
float d2 = d1+1;
System.out.println("程序运算d1+1:");
System.out.println(d2);
System.out.println("d1+1后用科学计数清表示应该是:");
System.out.println("4.23432424E8");
if(d1==d2 ){
System.out.println("d1==d2");
}else{
System.out.println("d1!=d2");
}
}
运行结果:

看到这样的测试题时,
是不是要先将float数值转换为科学计数法表示的形式?,
再看后面有几位小数,超出7位就忽略第7位小数之后的小数并且有第7位小数的运算也忽略吗?
1回答
同学你好,1、float,32位单精度浮点型数中,符号位占1位,尾数占23位,阶数占8位。并且float的尾数位(也即是小数点之后,E之前)是23bit,2的23次方约为10的6.923次方。也就是单精度浮点数转化为10进制后,小数可以保证至少6位、最多7位是精确的(也就是和原来的数是一致的)。
所以课程中老师会说它的小数点后做多保留7位。
2、float在内存中是按照科学计数法来存储的。
3、那么float数值在运算时,是以数值的形式运算?,还是以科学计数法的形式运算的?
在计算过程中是以二进制的形式来计算的。
4、小数点后超出第7位的小数都会被忽略,即使有关于小数点后第7位的小数的运算也是直接忽略吗?
根据第一点的描述,在float的小数点后超出第7位的小数,float的精度就会有所丢失,所以当出现第7位小数之后的小数并且有第7位小数的运算,并不是直接忽略了,而是在计算并转化为10进制后,不能精确转化,也就是我们说的精度丢失。
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
相似问题