3. 基本数据类型与变量运算
基本数据类型与变量运算
Java 的八种基本数据类型分为四类:整数型(byte、short、int、long)、浮点型(float、double)、字符型(char)和布尔型(boolean)。每种类型有固定的位数和取值范围,声明变量时必须先指定类型,再进行赋值和运算。
| 类型 | 位数 | 取值范围 | 默认值 |
|---|---|---|---|
| byte | 8 | -128 ~ 127 | 0 |
| short | 16 | -32768 ~ 32767 | 0 |
| int | 32 | -2³¹ ~ 2³¹-1 | 0 |
| long | 64 | -2⁶³ ~ 2⁶³-1 | 0L |
| float | 32 | 约 ±3.4×10³⁸(7位有效数字) | 0.0f |
| double | 64 | 约 ±1.8×10³⁰⁸(15位有效数字) | 0.0d |
| char | 16 | 0 ~ 65535(Unicode) | '\u0000' |
| boolean | 1 | true / false | false |
完整示例程序
下面的程序声明各类基本类型变量,演示自动类型提升、强制类型转换、整数溢出和浮点精度丢失,并输出每一步结果。
public class DataTypeDemo {
public static void main(String[] args) {
// 1. 声明各种基本类型变量
byte b = 100;
short s = 30000;
int i = 2000000000;
long l = 9000000000000000000L;
float f = 3.14f;
double d = 3.141592653589793;
char c = 'A';
boolean flag = true;
System.out.println("byte: " + b);
System.out.println("short: " + s);
System.out.println("int: " + i);
System.out.println("long: " + l);
System.out.println("float: " + f);
System.out.println("double: " + d);
System.out.println("char: " + c + " (ASCII: " + (int) c + ")");
System.out.println("boolean: " + flag);
// 2. 自动类型提升:int + long → long
long sum = i + l;
System.out.println("\n自动提升 int+long = " + sum);
// 3. 整数除法精度丢失
int a = 10, b2 = 3;
int intResult = a / b2;
double doubleResult = (double) a / b2;
System.out.println("整数除法 10/3 = " + intResult);
System.out.println("浮点除法 10/3 = " + doubleResult);
// 4. 强制类型转换:double → int 截断小数
double pi = 3.99;
int piInt = (int) pi;
System.out.println("(int)3.99 = " + piInt);
// 5. 整数溢出演示
byte maxByte = 127;
byte overflow = (byte) (maxByte + 1);
System.out.println("\nbyte 127 + 1 = " + overflow);
int maxInt = Integer.MAX_VALUE;
int intOverflow = maxInt + 1;
System.out.println("int MAX + 1 = " + intOverflow);
// 6. 浮点精度问题
double d1 = 0.1 + 0.2;
System.out.println("\n0.1 + 0.2 = " + d1);
System.out.println("是否等于 0.3: " + (d1 == 0.3));
}
}
运行结果与判读
byte: 100
short: 30000
int: 2000000000
long: 9000000000000000000
float: 3.14
double: 3.141592653589793
char: A (ASCII: 65)
boolean: true
自动提升 int+long = 9000000002000000000
整数除法 10/3 = 3
浮点除法 10/3 = 3.3333333333333335
(int)3.99 = 3
byte 127 + 1 = -128
int MAX + 1 = -2147483648
0.1 + 0.2 = 0.30000000000000004
是否等于 0.3: false
关键判读:
byte 127 + 1 = -128:byte 最大值加 1 后回绕到最小值,这是补码表示下的溢出行为。int MAX + 1 = -2147483648:int 溢出后变为最小值,不会抛出异常,需自行检查。0.1 + 0.2 != 0.3:double 无法精确表示 0.1 和 0.2,累加后产生微小误差,比较浮点数应使用容差范围。(int)3.99 = 3:强制转换直接截断小数部分,不进行四舍五入。
实践建议:涉及金额计算时使用
BigDecimal 而非 double;大整数运算使用 long 或 BigInteger;比较浮点数时用 Math.abs(a - b) < 1e-6 代替 ==。