分类: Java
2019-11-07 11:58:30
在赋值运算或算术运算时,要求数据类型相同,否则要进行类型转换
转换方式:
自动转换
强制转换
除boolean类型外,所有的基本数据类型因为各自的精度不同,赋值时都要考虑这个问题
除boolean类型外,所有的基本数据类型包括:整型,浮点型,字符型。
算术运算时的转换
整型,浮点型,字符型数据可以混合运算。
运算中相邻两个操作数先转化为同一类型,转换从低级到高级,然后进行运算;运算的结果再 和下一个操作数据进行运算,规则相同
3+'A'+45L
5+3.6+ 'A'+3.14f
赋值运算时的转换
自动类型转换(左>右)
代码示例
package com.cwl.base.day01;
/**
* @program: java_base
* @description: 测试基本数据类型(整型变量)
* @author: ChenWenLong
* @create: 2019-11-05 15:11
**/
public class TestPrimitiveDataType {
public static void main(String[] args) {
//测试整型变量
int a = 15;
int b = 015; //以0开头是八进制
int c = 0x15; //以0x开头是16进制
int d = 0b1101; //以0b开头是二进制
System.out.println(b);
System.out.println(c);
System.out.println(d);
byte age = 30;
short salary = 30000;
int population = 2000000000; //整型常量默认是int类型
long globalPopulation = 7400000000L; //后面加L就是这是一个long类型的常量
}
}
package com.cwl.base.day01;
import java.math.BigDecimal;
/**
* @program: java_base
* @description: 测试浮点型
* @author: ChenWenLong
* @create: 2019-11-05 15:13
**/
public class TestPrimitiveDataType2 {
public static void main(String[] args) {
float a = 3.14F;
double b = 6.28;
double c = 628E-2;
System.out.println(c);
// 浮点数是不精确的,一定不要用于比较!
float f = 0.1f;
double d = 1.0 / 10;
System.out.println(f == d); // 结果为false
float d1 = 423432423f;
float d2 = d1 + 1;
if (d1 == d2) {
System.out.println("d1==d2");// 输出结果为d1==d2
} else {
System.out.println("d1!=d2");
}
System.out.println("##################");
//使用精确浮点运行,推荐:BigDecimal
BigDecimal bd = BigDecimal.valueOf(1.0);
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
System.out.println(bd);// 0.5
System.out.println(1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1);// 0.5000000000000001
BigDecimal bd2 = BigDecimal.valueOf(0.1);
BigDecimal bd3 = BigDecimal.valueOf(1.0/10.0);
System.out.println(bd2.equals(bd3));
}
}
package com.cwl.base.day01;
/**
* @program: java_base
* @description: 测试字符类型和布尔类型
* @author: ChenWenLong
* @create: 2019-11-05 15:14
**/
public class TestPrimitiveDataType3 {
public static void main(String[] args) {
char a = 'T';
char b = '尚';
char c = '\u0061';
System.out.println(c);
//转义字符
System.out.println(""+'a'+'\n'+'b');
System.out.println(""+'a'+'\t'+'b');
System.out.println(""+'a'+'\''+'b'); //a'b
//String就是字符序列
String d = "abc";
//测试布尔类型
boolean man = false;
if(man){ //极端不推荐:man==true
System.out.println("男性");
}
}
}
总结
=右侧:所有变量先转换为字节数最多的数据类型,再计算
=两侧:左侧宽度>右侧宽度 自动转换
左侧宽度<右侧宽度 强制转换
特例
可以将整型常量直接赋值给加密货币byte, short, char等类型变量,而不需要进行强制类型转换,只要不超 出其表数范围
测试自动类型转化
package com.cwl.base.day01;
/**
* @program: java_base
* @description: 测试自动类型转化
* @author: ChenWenLong
* @create: 2019-11-05 15:17
**/
public class TestTypeConvert {
public static void main(String[] args) {
int a = 324;
long b = a;
double d = b;
// a = b;
// long e = 3.23F;
float f = 234324L;
//特例
byte b2 = 123;
}
}
测试类型转换常见问题
package com.cwl.base.day01;
/**
* @program: java_base
* @description: 测试类型转换常见问题
* @author: ChenWenLong
* @create: 2019-11-05 15:18
**/
public class TestTypeConvertError {
public static void main(String[] args) {
int money = 1000000000; //10亿
int years = 20;
//返回的total是负数,超过了int的范围
int total = money*years;
System.out.println("total="+total);
//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long。但是已经发生//了数据丢失
long total1 = money*years;
System.out.println("total1="+total1);
//返回的total2正确:先将一个因子变成long,整个表达式发生提升。全部用long来计算。
long total2 = money*((long)years);
System.out.println("total2="+total2);
long total3 = 34L*3223*years*223423;
System.out.println(total3);
//命名问题
int l = 2; //分不清是L还是1,
long a = 23451l;//建议使用大写L
System.out.println(l+1);
}
}