一个小程序笔记-java中浮点型细节

来源:互联网 发布:dorado js 编辑:程序博客网 时间:2024/05/22 07:46

public class day01_01 {

 

public static void main(String[] args) {

double da = 9.1234567890123456789;

double db = 9;

float  dc = 9.123456789f;

//  float  dd = 9.1;          //ERROR:丢失精度,不能自动转换。

System.out.println(da);  // 精度位(有效位):16

System.out.println(db);

System.out.println(dc);  // 精度位(有效位):7

}

}

 

 

运行结果:

9.123456789012346

9.0

9.123457


由运行结果可以得出:

1、double类型数据的精度:16位

   double的数据存:1个符号位、11个指数位、52个尾数位

   所以它的精度可以表示到:2^52=4503599627370496; 

2、float类型数据的精度: 7位

   Float的数据存储:1个符号位、8个指数位、23个尾数位

   所以它的精度可以表示到:2^23=8388608;  

3、在使用字面值赋值时需要注意满足两个条件:

   (1)字面值的值不能超了自己本身的范围。eg:int  ax = 2^31;//error

   (2)字面值的值不能超了赋值对象的范围。eg:byte bx = 128; //error

4、在使用变量赋值时需要注意:

   不能使用变量给小类型的变量赋值。  eg:int ax = 11; byte bx = ax; //error

5、浮点类型的字面量默认是double型的。

   需要注意的是上述程序中,float dd = 9.1;满足字面值赋值条件为什么还会报错?而同样的byte bx = 11;就不会报错呢?

原因:

   在这里,需要注意的是  浮点型类型处理的都是小数。操作不当会丢失精度。因为默认的浮点型字面值是double型的  是16位的精度,而float的精度只有7位。所以,在赋值时就会丢失精度,Java程序是禁止这种隐式转换的。除非自己清楚并容许精度的丢失。在自己的可控范围内进行类型转换。float dd = 9.1f;而整型类型数据不存在丢失精度的问题, 只要满足上述两个字面值赋值条件就能保证数据的精确性。

 

0 0
原创粉丝点击