跳转至

数字以及运算

数字类型是编程中最基础的数据类型,用于:

  1. 存储各种数值数据
  2. 进行数学计算和运算
  3. 控制程序流程和逻辑
  4. 处理业务数据中的数值信息

图表说明

graph LR
    byte_t[byte]
    short_t[short]
    int_t[int]
    long_t[long]
    float_t[float]
    double_t[double]

    byte_t  --> short_t
    short_t --> int_t
    int_t  --> long_t
    int_t  --> float_t
    float_t  --> double_t

详细说明

Java中的数字类型分为两大类:

  1. 整数类型:

    • byte:8位,范围-128~127
    • short:16位,范围±32K
    • int:32位,范围±21亿,最常用
    • long:64位,范围±922万亿亿

    8位(byte):一个byte类型的数据占用8位内存空间。由于计算机使用二进制表示数据,8位可以表示的数值范围是2的8次方,即256个不同的数值。Java中的byte类型使用补码表示法,因此其范围是从-128到127。

  2. 浮点类型:

    • float:32位,7位精度
    • double:64位,15位精度,最常用

运算说明

Java中的数字类型支持多种运算操作,包括:

  1. 算术运算

    • 加法(+):用于两个数值的相加。
    • 减法(-):用于从一个数值中减去另一个数值。
    • 乘法(*):用于两个数值的相乘。
    • 除法(/):用于一个数值除以另一个数值,注意整数除法会截断小数部分。
    • 取模(%):用于获取两个数值相除后的余数。
  2. 自增和自减运算

    • 自增(++):将数值增加1。
    • 自减(--):将数值减少1。
  3. 赋值运算

    • 赋值(=):用于将右侧的值赋给左侧的变量。
    • 复合赋值(+=, -=, *=, /=, %=):用于在赋值的同时进行相应的算术运算。
  4. 比较运算

    • 等于(==):用于比较两个数值是否相等。
    • 不等于(!=):用于比较两个数值是否不相等。
    • 大于(>)、小于(<)、大于等于(>=)、小于等于(<=):用于比较两个数值的大小关系。
  5. 位运算

    • 与(&)、或(|)、异或(^):用于按位进行与、或、异或运算。
    • 左移(<<)、右移(>>)、无符号右移(>>>):用于按位移动数值。

这些运算符可以用于基本数据类型的运算,并且可以结合使用以实现复杂的计算逻辑。

例子

// 算术运算示例
public class ArithmeticExample {
    public static void main(String[] args) {
        int a = 10;
        int b = 5;
        int sum = a + b; // 加法
        int difference = a - b; // 减法
        int product = a * b; // 乘法
        int quotient = a / b; // 除法
        int remainder = a % b; // 取模
        System.out.println("Sum: " + sum);
        System.out.println("Difference: " + difference);
        System.out.println("Product: " + product);
        System.out.println("Quotient: " + quotient);
        System.out.println("Remainder: " + remainder);
    }
}

// 自增和自减运算示例
public class IncrementDecrementExample {
    public static void main(String[] args) {
        int x = 10;
        x++; // 自增
        System.out.println("After increment: " + x);
        x--; // 自减
        System.out.println("After decrement: " + x);
    }
}

// 赋值运算示例
public class AssignmentExample {
    public static void main(String[] args) {
        int a = 10;
        a += 5; // 复合赋值,加法
        System.out.println("After += : " + a);
        a -= 3; // 复合赋值,减法
        System.out.println("After -= : " + a);
        a *= 2; // 复合赋值,乘法
        System.out.println("After *= : " + a);
        a /= 4; // 复合赋值,除法
        System.out.println("After /= : " + a);
        a %= 3; // 复合赋值,取模
        System.out.println("After %= : " + a);
    }
}

// 比较运算示例
public class ComparisonExample {
    public static void main(String[] args) {
        int a = 10;
        int b = 5;
        System.out.println("a == b: " + (a == b)); // 等于
        System.out.println("a != b: " + (a != b)); // 不等于
        System.out.println("a > b: " + (a > b)); // 大于
        System.out.println("a < b: " + (a < b)); // 小于
        System.out.println("a >= b: " + (a >= b)); // 大于等于
        System.out.println("a <= b: " + (a <= b)); // 小于等于
    }
}

// 位运算示例
public class BitwiseExample {
    public static void main(String[] args) {
        int a = 5; // 0101
        int b = 3; // 0011
        System.out.println("a & b: " + (a & b)); // 与
        System.out.println("a | b: " + (a | b)); // 或
        System.out.println("a ^ b: " + (a ^ b)); // 异或
        System.out.println("a << 1: " + (a << 1)); // 左移
        System.out.println("a >> 1: " + (a >> 1)); // 右移
        System.out.println("a >>> 1: " + (a >>> 1)); // 无符号右移
    }
}

注意事项

  1. 整数除法会截断小数部分:例如,5 / 2 的结果是 2,而不是 2.5

    int result = 5 / 2;
    System.out.println("5 / 2 = " + result); // 输出: 5 / 2 = 2
    

  2. 大范围类型可以自动转换为小范围类型,但需要强制类型转换:

    double largeValue = 9.99;
    int smallValue = (int) largeValue; // 强制类型转换
    System.out.println("largeValue 转换为 smallValue: " + smallValue); // 输出: largeValue 转换为 smallValue: 9
    

  3. 浮点数比较应该使用误差范围,不要直接使用==

    double a = 0.1 * 3;
    double b = 0.3;
    if (Math.abs(a - b) < 0.0001) {
        System.out.println("a 和 b 在误差范围内相等");
    } else {
        System.out.println("a 和 b 不相等");
    }
    

  4. 注意数值溢出问题,特别是int类型的最大值:

    int maxValue = Integer.MAX_VALUE;
    System.out.println("int 最大值: " + maxValue);
    System.out.println("int 最大值加1: " + (maxValue + 1)); // 结果会溢出,输出负数
    

  5. 使用long类型时记得加L后缀:

    long bigNumber = 10000000000L; // 注意L后缀
    System.out.println("long 类型数值: " + bigNumber);
    

  6. 使用float类型时记得加f后缀:

    float pi = 3.14f; // 注意f后缀
    System.out.println("float 类型数值: " + pi);