Java数据类型转换问题
Java为强类型语言,低位可向高位转换
计算过程中的转换
隐式转换
计算过程中以高位为准,如int*long计算过程中会先把int转换成long类型,然后再参与运算
byte a = 4;
byte b = 100;
byte c = a + b;
计算过程中会自动转换成int进行计算,int转换成byte报错。
注意:会产生溢出,编译没有问题,但是结构是负数,在计算过程中两个int类型相乘结构还是int,溢出。
int count = 100000000;
int price = 1999;
long totalPrice = count * price;
转换过程中丢失精度
丢失精度问题主要体现在浮点数问题上面
double 共占64位,第一位为符号位置,11位指数位,52位小数位。
float共占为32位,同样第一位为符号位置,8位指数位置,23位小数位。
float f = 20014999;
double d = f;
double d2 = 20014999;
System.out.println("f=" + f);
System.out.println("d=" + d);
System.out.println("d2=" + d2);
结果为
f=2.0015E7
d=2.0015E7
d2=2.0014999E7
因为2001499转换成二进制表示:
Double:1 00000101110 011000101100111100101110000000000000000000000000000
Float:1001011100110001011001111001100
double为64位,后面表示小数位,刚好24位,余下补零,而float小数位占23位,不能表述全,只能四舍五入。
解决方案:通过类BigDecimal解决
强制类型转换
高位变低位,当高位数在低位范围内正常表示,超过范围就失去意义了变成负数