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;而整型类型数据不存在丢失精度的问题, 只要满足上述两个字面值赋值条件就能保证数据的精确性。