Java中整数型与浮点数等数据类型的使用细节

Java中整数型与浮点数等数据类型的使用细节

各类型所占大小

类型 字符数
byte 1字节
char 2字节
short 2字节
int 4字节
float 4字节
long 8字节
double 8字节
boolean 至少1字节

从Java7开始,加上前缀0b或者0B就可以写二进制数,0b1001表示9。

一个byte的值b可以不表示范围-128-127,如果表示0-255,也可以使用byte

下面的这种情况,没有出现我们期望的0.9,主要原因是浮点数采用二进制系统表示,在二进制系统中无法精确表示1/10,就好像十进制无法表示分数1/3一样。所以这种情况我们 使用大数表示。https://moonshuo.cn/posts/30946.html

image-20220606215246295

整数型

首先Java中默认的整数型为int数据类型,其取值范围为2^31-1——-2^31,而其中long类型的取值范围为2^63-1——-2^63,如果运行以下一段程序,会出现值损失的情况,是因为long表示的数据范围大于int可表示的数据范围,int的类型值存储不了long类型的值。

1
2
3
4
5
6
7
8
public class Test {
public static void main(String [] args){
int a=1;
long b=2;
a=b;
System.out.println(a);
}
}

image-20220331123731718

但是对于byte类型或者short类型的数据赋值给int类型,则其最终的类型为自动升级为更加高级的int类型

浮点型

浮点数=符号位+指数位+尾数位(尾数部分可能会包括不了全部的尾数,会造成精度损失,小数都是近似值),在浮点型中分为double型与float类型,而Java默认的使用double类型,如果想要使用float类型,必须在数的最后加上f,表示这是一个单精度浮点数,否则会发生值损失错误。运行以下程序,会发生信息报错。而如果在10.2后面加上f,则不会报错。

1
2
3
4
5
6
7
8
9
10
public class Test {
/**这是算出函数类型的数据*/
public static String getType(Object o){
return o.getClass().toString();
}
public static void main(String [] args){
float a=10.2;
System.out.println(a);
}
}

image-20220331123817168

image-20220331123847863

这是因为不加上f,表示double型的数据10.2赋值给float类型的a,由大转小会损失,而加上f之后,就是将float类型赋值给float类型,不会发生值损失。

浮点型科学计数法的表示,例如int a=5.12e2,表示5.12*(10^2)=512

1
2
3
4
5
6
7
8
9
10
public class Test {
/**这是算出函数类型的数据*/
public static String getType(Object o){
return o.getClass().toString();
}
public static void main(String [] args){
double a=5.12e2;
System.out.println(a);
}
}

image-20220331123904423

浮点型使用中常见的陷阱问题,从数学的角度来看,a与b应该完全相等的,但是计算机算出并不是相等,是因为计算机并不快速识别出8.1后面是否还有其他数值,所以计算机选择进行无限接近算出结果。所以并不建议用浮点型除法进行大小比较运算,如果真的要进行比较,通常在计算机中在某个精度范围内进行比较,不超过某个精度,即认为其相等。

1
2
3
4
5
6
7
8
9
public class Test {
public static void main(String [] args){
double a=8.1/3;
double b=2.7;
System.out.println(a!=b?"a与b不相等":"a与b不想等");
System.out.println(a);
System.out.println(b);
}
}

image-20220331123933887

字符类型

用单引号引出,并且其中只能包含一个字符,而对应的转义字符也表示一个字符,占据一个符号位,即char类型如果包含转义字符,就不能包含其他字符了。

1
2
3
4
5
6
7
8
public class Test {
public static void main(String [] args){
char a='哈';
char b='\t';
System.out.println(a);
System.out.println(b);
}
}

在Java中char的本质是一个整数,在输出时,是unicode对应的字符,例如a对应的字符编码为97,张的Unicode的对应的编码为24352,运行以下程序

1
2
3
4
5
6
7
8
9
10
11
public class Test {
public static void main(String [] args){
char a=97;
char b='a';
char c='张';
System.out.println(a);
//这里由于b的类型为char,输出响应的转义字符时需要进行强制类型转换
System.out.println((int)b);
System.out.println((int)c);
}
}

布尔类型

布尔类型取值只允许取值为true与false,而且仅仅只占有一个字节。