关于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");
   }
}

运行结果:

http://img.mukewang.com/climg/5ec7a7ab092e244304680368.jpg

看到这样的测试题时,

是不是要先将float数值转换为科学计数法表示的形式?,

再看后面有几位小数,超出7位就忽略第7位小数之后的小数并且有第7位小数的运算也忽略吗?


写回答

1回答

好帮手慕小班

2020-05-22

同学你好,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进制后,不能精确转化,也就是我们说的精度丢失。

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

0

0 学习 · 8263 问题

查看课程