- 基本数据类型
整数 | 占用字节数 |
---|---|
byte | 1 |
short | 2 |
int | 4 |
long | 8 |
浮点数 | 占用字节数 |
---|---|
float | 4 |
double | 8 |
字符 | 占用字节数 |
---|---|
char | 2 |
布尔 | 占用字节数 |
---|---|
boolean | 1 |
整数默认是int类型,浮点数默认是double。
长整数要加L或者l。
单精度的浮点数要加F或者f。
- 数据类型转换
- 默认转换
A:从小到大
B:byte,short,char – int – long – float – double
C:byte,short,char之间不相互转换,直接转成int类型参与运算。 - 强制转换
A:从大到小
B:可能会有精度的损失,一般不建议这样使用。
C:格式:
目标数据类型 变量名 = (目标数据类型) (被转换的数据);
- 默认转换
float f1 = 12.123456789;
float f2 = 12.123456789f;
float f3 = (float)12.123456789;
上述代码,f1会报错,因为java浮点默认类型是double。
f2、f3的区别在于:f2本身就是float类型,f3是通过一个double类型强制转换得到的。
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
short s1=3;
short s2=3;
short s3 = s1 + s2;
char c1=3;
char c2=4;
char c3 = c1 + c2;
byte b4 = 3 + 4;
short s3 = 3 + 4;
char c3 = 3 + 4;
上述代码,b3、s3、c3会报错,因为byte、short、char在运算时,会自动转换成int类型,右边的int类型赋值给byte、short、char类型便会报错,加上强制类型转换可以通过编译。比如b = (byte) (b1+b2);
byte b4 = 3 + 4;不会报错,是因为jvm会自动装箱转换,实际是byte b4 = (byte) 3 + 4;
byte b1 = 130;
byte b2 = (byte)130;
上述代码,b1会报错,因为byte类型数值范围为-128~127之间。b2虽然强制转换成byte类型,但是会造成数据丢失,b2最终打印值为 -126。
System.out.println("hello" + 'a' + 1);
System.out.println('a'+ 1 + "hello");
System.out.println("5+5=" + 5 + 5);
System.out.println(5+5+"=5+5");
输出:
helloa1
98hello
5+5=55
10=5+5
字符串参与运算就是字符串的连接
- 浮点型运算注意点
float f4 = 12.348f;
float f5 = 12.345f;
System.out.println(f4);
System.out.println(f5);
System.out.println(f4-f5);
输出:
12.348
12.345
0.0029993057
因为浮点型运行结果会丢失精确度。
改进:
BigDecimal b1 = new BigDecimal(
Float.toString(f4));
BigDecimal b2 = new BigDecimal(
Float.toString(f5));
float result = b1.subtract(b2).
floatValue();
System.out.println(result);
输出:
0.003
因为不是所有的浮点数都能够被精确的表示成一个double 类型值,有些浮点数值不能够被精确的表示成 double 类型值,因此它会被表示成与它最接近的 double 类型的值。必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。