数据类型强制转换

  • 基本数据类型
整数 占用字节数
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类的构造方法注释中有说明。

你可能感兴趣的:(Java,java)