JAVA类型转换怎么变

类型转换

类型转换是将一个值从一种类型更改为另一种类型的过程。例如, 可以将String类型的数据“457”转换为数值型,也可以将任意类型的 数据转换为String类型。 如果从低精度数据类型向高精度数据类型转换,则永远不会溢出, 并且总是成功的;而把高精度数据类型向低精度数据类型转换时,则会 有信息丢失,有可能失败。 数据类型转换有两种方式,即隐式转换与显式转换。

隐式类型转换

从低级类型向高级类型的转换,系统将自动执行,程序员无须进行任何操作。这种类型的转换称为隐式转换。下列基本数据类型会涉及数 据转换,不包括逻辑类型和字符类型。这些类型按精度从低到高排列的 顺序为byte < short < int < long < float < double

int x = 5;
float y = x; // y = 5.0

隐式转换也要遵循一定的规则,来解决在什么情况下将哪种类型的 数据转换成另一种类型的数据。表列出了各种数据类型隐式转换的 一般规则。

image-20240923091040507

编译阶段

在编译阶段,Java 编译器会检查 x 的类型,并且知道它是一个 int 类型的值。由于 float 类型可以表示比 int 类型更大的范围,并且 float 类型具有更高的精度,所以编译器允许这种类型的转换而不需要显式的类型转换操作符。

运行阶段

在运行时,当这段代码被执行时,JVM 会将 int 类型的值转换为 float 类型。具体来说,这涉及到将 int 类型的 32 位整数值转换为 float 类型的 32 位单精度浮点数格式。

这个转换实际上是通过将整数值编码为一个特殊的浮点数来完成的,其中整数被视为一个十进制数,并且没有小数部分。这意味着,对于任何整数值,只要它在 float 类型可表示的范围内(即不超出 float 类型的最大值),这个转换就是精确无误的。

内存布局

在内存中,x 是一个 32 位的整数,而 y 是一个同样占据 32 位但按照 IEEE 754 标准存储的浮点数。当 x 的值被复制到 y 时,实际上发生了以下步骤:

  1. 读取 x 的值。
  2. 将这个整数值解释为一个浮点数,这意味着创建一个浮点数的内部表示形式,包括符号位、指数和尾数部分。
  3. 将转换后的值存储到 y 中。

由于 intfloat 都是 32 位宽,因此这个转换不会涉及额外的数据扩展或压缩。但是需要注意的是,尽管 5 作为一个整数可以直接转换为 5.0f 并且不会丢失任何信息,但对于某些其他的 int 值,转换到 float 可能会导致精度上的损失。

byte mybyte =127;//定义 byte 型变量 mybyte,并把允许的最大值赋给 mybyte
int myint = 150; //定义int型变量 myint,并赋值 150
float myfloat = 452.12f;//定义 float 型变量 myfloat,并赋值
char mychar = 10;//定义 char型变量 mychar,并赋值
double mydouble =45.46546;//定义 double 型变量,并赋值
//将运算结果输出

System.out.println("byte 型与 float 型数据进行运算结果为:"+(mybyte+ myfloat));
System.out.println("byte 型与int型数据进行运算结果为:"+mybyte*myint);
System.out.println("byte 型与 char 型数据进行运算结果为:"+mybyte/mychar);
System.out.println("double 型与 char 型数据进行运算结果为:"+(mydouble +mychar));

image-20240923092233328

mybyte 是一个 byte 类型的值,而 myfloat 是一个 float 类型的值。由于 float 类型的范围和精度都大于 byte 类型,因此 byte 类型的值会被提升为 float 类型,然后进行加法运算。最终的结果是一个 float 类型的值。

mybyte 是一个 byte 类型的值,而 myint 是一个 int 类型的值。byte 类型的值会被提升为 int 类型,然后与 int 类型的值进行乘法运算。最终的结果是一个 int 类型的值。

mybyte 是一个 byte 类型的值,而 mychar 是一个 char 类型的值。char 类型本质上是一个 int 类型的值(16 位),因此 byte 类型的值会被提升为 int 类型,然后进行除法运算。最终的结果是一个 int 类型的值。

mydouble 是一个 double 类型的值,而 mychar 是一个 char 类型的值。char 类型的值会被提升为 int 类型,然后 int 类型的值会被进一步提升为 double 类型,因为 double 类型的范围和精度都大于 int 类型。最后,两个 double 类型的值进行加法运算,得到的结果也是一个 double 类型的值。

显示类型转换

当把高精度的变量的值赋给低精度的变量时,必须使用显式类型转 换运算(又称强制类型转换)。

执行显式类型转换时,可能会导致精度损失。除boolean类型外, 其他基本类型都能以显式类型转换的方法实现转换。

当把整数赋值给一个byte、short、int、long型变量时,不可以 超出这些变量的取值范围,否则必须进行强制类型转换。例如: byte b = (byte)129image-20240923102413377

int num = 10;
System.out.println("整数值为: " + num);

//将int转换为字符串类型
String data = String.valueOf(num);
System.out.println("字符串值为: " + data);

在这里,我们使用了Java String类valueOf()方法将int类型变量转换为字符串。

int a =(int)45.23; //45
long y=(long)456.6F; //456
int b = (int)'d'; //100

在浮点数向整数型转换的过程中,小数部分被丢弃了,因为 int 类型只能存储整数部分。这个过程是不可逆的,数据丢失是强制转换的常见问题。表达式强制转换,记得给表达式也加上括号,否侧计算机就会认为先强制转换d,再和a相加。

 double d = 9.99;
double a = 7.99;
int i = (int)(d + a); // 强制将表达式转换为 int
System.out.println(i); // 输出17
System.out.println((int)d+a); // 输出 16.99

四舍五入可以使用Math.round()方法。

posted @ 2024-09-23 10:53  ivanlee717  阅读(52)  评论(0编辑  收藏  举报