Java类型转换 #

一、类型转换概述 #

Java是强类型语言,不同类型的数据进行运算或赋值时,需要进行类型转换。

类型转换分为两种:

  • 自动类型转换(隐式转换):小类型到大类型,自动完成
  • 强制类型转换(显式转换):大类型到小类型,需要显式声明

二、自动类型转换 #

2.1 转换规则 #

从小到大自动转换:

text
byte → short → int → long → float → double
         ↓
        char → int
java
// 自动类型转换
byte b = 10;
short s = b;    // byte → short
int i = s;      // short → int
long l = i;     // int → long
float f = l;    // long → float
double d = f;   // float → double

// char → int
char c = 'A';
int code = c;   // 65

2.2 转换条件 #

自动类型转换需要满足:

  1. 两种类型兼容
  2. 目标类型大于源类型
java
// 正确:int → long
int num = 100;
long bigNum = num;

// 错误:long → int(需要强制转换)
// int small = bigNum;

2.3 表达式中的自动提升 #

在表达式中,操作数会自动提升到较大类型:

java
byte a = 10;
byte b = 20;
// byte c = a + b;  // 错误:结果是int
int c = a + b;      // 正确

// 提升规则
byte + byte → int
short + short → int
int + long → long
float + double → double

2.4 赋值时的自动转换 #

java
// 整数常量赋值
byte b1 = 10;      // 常量在byte范围内,自动转换
short s1 = 100;    // 常量在short范围内,自动转换

// byte b2 = 128;  // 错误:超出byte范围
// short s2 = 32768; // 错误:超出short范围

// 浮点数赋值
// float f = 3.14;   // 错误:默认是double
float f = 3.14f;     // 正确:使用f后缀
double d = 3.14;     // 正确:默认double

三、强制类型转换 #

3.1 语法格式 #

java
目标类型 变量名 = (目标类型) 源值;

3.2 基本用法 #

java
// 大类型到小类型
double d = 3.14;
int i = (int) d;    // 3(截断小数部分)

long l = 100L;
int n = (int) l;    // 100

// 强制转换可能丢失精度
double pi = 3.14159;
int intPi = (int) pi;  // 3

3.3 整数溢出 #

java
int big = 128;
byte small = (byte) big;
System.out.println(small);  // -128(溢出)

// 解释:
// 128的二进制: 00000000 00000000 00000000 10000000
// 强制转byte后: 10000000(补码表示-128)

3.4 浮点数转整数 #

java
double d1 = 3.9;
int i1 = (int) d1;  // 3(直接截断,不是四舍五入)

// 四舍五入
long rounded = Math.round(d1);  // 4

// 向下取整
double d2 = 3.9;
int floor = (int) Math.floor(d2);  // 3

// 向上取整
int ceil = (int) Math.ceil(d2);    // 4

四、类型转换规则详解 #

4.1 整数类型转换 #

java
// 小到大:安全
byte → short → int → long

// 大到小:可能溢出
long → int → short → byte

// 示例
int i = 130;
byte b = (byte) i;  // -126(溢出)

// 检查范围
if (i >= Byte.MIN_VALUE && i <= Byte.MAX_VALUE) {
    b = (byte) i;
}

4.2 浮点类型转换 #

java
// float → double:安全
float f = 3.14f;
double d = f;

// double → float:可能丢失精度
double d2 = 3.14159265358979;
float f2 = (float) d2;  // 3.1415927

4.3 整数与浮点转换 #

java
// 整数 → 浮点:安全(但可能精度损失)
long l = 1234567890123456789L;
float f = l;  // 可能有精度损失
double d = l; // 精度更好

// 浮点 → 整数:截断小数
double d2 = 3.99;
int i = (int) d2;  // 3

4.4 char与其他类型 #

java
// char → int:获取编码值
char c = 'A';
int code = c;  // 65

// int → char:获取字符
int code2 = 65;
char c2 = (char) code2;  // 'A'

// char与byte/short
char c3 = '中';
// byte b = c3;      // 错误:需要强制转换
byte b = (byte) c3;   // 可能溢出
short s = (short) c3; // 正确

五、表达式类型提升 #

5.1 提升规则 #

表达式中的操作数会提升到:

  1. 至少是int类型
  2. 提升到操作数中最大的类型
java
byte a = 10;
byte b = 20;
byte c = (byte) (a + b);  // 需要强制转换

short s1 = 100;
short s2 = 200;
short s3 = (short) (s1 + s2);  // 需要强制转换

int i = 10;
long l = 20L;
long result = i + l;  // 提升为long

5.2 复合赋值运算符 #

复合赋值运算符会自动进行类型转换:

java
byte b = 10;
// b = b + 1;    // 错误:结果是int
b += 1;          // 正确:自动强制转换

// 等价于
b = (byte) (b + 1);

5.3 混合运算 #

java
int i = 10;
long l = 20L;
float f = 3.14f;
double d = 2.5;

// 结果类型是double(最大类型)
double result = i + l + f + d;

六、常见问题 #

6.1 精度丢失 #

java
// 整数精度丢失
long big = 1234567890123456789L;
float f = big;  // 1.23456794E18(精度丢失)
double d = big; // 1.23456789012345677E18(精度更好)

// 浮点精度问题
double d1 = 0.1;
double d2 = 0.2;
System.out.println(d1 + d2);  // 0.30000000000000004

6.2 溢出问题 #

java
int a = 2147483647;  // int最大值
int b = a + 1;
System.out.println(b);  // -2147483648(溢出)

// 使用long避免溢出
long c = (long) a + 1;
System.out.println(c);  // 2147483648

// 或者使用Math.addExact检测溢出
try {
    int d = Math.addExact(a, 1);
} catch (ArithmeticException e) {
    System.out.println("溢出");
}

6.3 比较问题 #

java
// 浮点数比较
double d1 = 0.1 + 0.2;
double d2 = 0.3;
System.out.println(d1 == d2);  // false

// 正确方式:使用误差范围
System.out.println(Math.abs(d1 - d2) < 1e-10);  // true

// 或者使用BigDecimal
BigDecimal bd1 = new BigDecimal("0.1");
BigDecimal bd2 = new BigDecimal("0.2");
BigDecimal bd3 = bd1.add(bd2);
System.out.println(bd3.compareTo(new BigDecimal("0.3")) == 0);  // true

七、包装类转换 #

7.1 基本类型与包装类 #

java
// 自动装箱
Integer i = 100;  // int → Integer
Double d = 3.14;  // double → Double

// 自动拆箱
int num = i;      // Integer → int
double value = d; // Double → double

7.2 字符串与基本类型 #

java
// 字符串 → 基本类型
int i = Integer.parseInt("100");
double d = Double.parseDouble("3.14");
boolean b = Boolean.parseBoolean("true");

// 基本类型 → 字符串
String s1 = String.valueOf(100);
String s2 = String.valueOf(3.14);
String s3 = Integer.toString(100);
String s4 = 100 + "";  // 简单方式

八、最佳实践 #

8.1 避免不必要的转换 #

java
// 不好的做法
int a = 10;
double b = a;  // 不必要的转换

// 好的做法
int a = 10;
int b = a;

8.2 注意范围检查 #

java
public static int safeLongToInt(long value) {
    if (value < Integer.MIN_VALUE || value > Integer.MAX_VALUE) {
        throw new IllegalArgumentException("值超出int范围");
    }
    return (int) value;
}

8.3 使用Math方法 #

java
// 使用Math.round进行四舍五入
long rounded = Math.round(3.5);  // 4

// 使用Math.floor和Math.ceil
double floor = Math.floor(3.9);  // 3.0
double ceil = Math.ceil(3.1);    // 4.0

九、总结 #

转换类型 说明 示例
自动转换 小类型→大类型 int → long
强制转换 大类型→小类型 long → int
表达式提升 自动提升到较大类型 byte + byte → int

类型转换要点:

  • 自动转换:安全,无精度损失
  • 强制转换:可能丢失精度或溢出
  • 表达式中byte/short/char自动提升为int
  • 注意浮点数精度问题
  • 大数值使用long或BigDecimal
最后更新:2026-03-26