Java常用类核心详解(一):Math 类超细讲解

🏠个人主页:黎雁

🎬作者简介:C/C++/JAVA后端开发学习者

❄️个人专栏:C语言数据结构(C语言)EasyXJAVA游戏规划程序人生

✨ 从来绝巘须孤往,万里同尘即玉京

文章目录

  • [Java常用类核心详解(一):Math 类超细讲解 ✨](#Java常用类核心详解(一):Math 类超细讲解 ✨)
    • [📚 知识回顾](#📚 知识回顾)
    • [📝 文章摘要](#📝 文章摘要)
    • [1. Math 类概述 🧮](#1. Math 类概述 🧮)
    • [2. 常用方法一览表 📋](#2. 常用方法一览表 📋)
    • [3. 方法细节 + 代码逐行讲解 💻](#3. 方法细节 + 代码逐行讲解 💻)
      • [3.1 绝对值:abs() / absExact()](#3.1 绝对值:abs() / absExact())
      • [3.2 向上取整 ceil()](#3.2 向上取整 ceil())
      • [3.3 向下取整 floor()](#3.3 向下取整 floor())
      • [3.4 四舍五入 round()](#3.4 四舍五入 round())
      • [3.5 最大/最小、幂、开方](#3.5 最大/最小、幂、开方)
      • [3.6 随机数 random() 🔥(高频面试/开发)](#3.6 随机数 random() 🔥(高频面试/开发))
    • [4. 完整测试代码 ✅](#4. 完整测试代码 ✅)
    • [📌 重点总结(面试必背)](#📌 重点总结(面试必背))
    • [✍️ 写在最后](#✍️ 写在最后)

Java常用类核心详解(一):Math 类超细讲解 ✨

本文属于 Java 常用类核心精讲系列,持续更新中~

📚 知识回顾

在正式学习之前,我们先快速回顾一下前置知识点:

  • Java 中 工具类 一般是 final 修饰、构造方法私有、方法全部静态
  • java.lang 包下的类使用时不需要导包
  • 静态方法直接通过 类名.方法名 调用

📝 文章摘要

  • 文章主题 :Java 中 Math 数学工具类详解,包含常用方法、源码细节、坑点、实战案例
  • 阅读时长:8 分钟
  • 适合人群
    • Java 零基础小白:掌握数学计算 API,告别手写复杂逻辑
    • 初中级开发:系统梳理 Math 类,避开精度与边界坑点
    • 面试备考者:熟记 abs 边界问题、取整规则、随机数生成
  • 阅读重点
    1. Math 类设计思想(工具类、不可继承、私有构造)
    2. 常用方法用法与区别
    3. absabsExact 底层差异与 Integer 最小值坑点
    4. 向上取整、向下取整、四舍五入规则
    5. 随机数 [1, 100] 标准写法

1. Math 类概述 🧮

Math 是 Java 内置的数学运算工具类,提供大量常用数学计算方法,不用重复造轮子。

核心特点

  • 位于 java.lang 包,不用导包
  • public final 修饰,不能被继承
  • 构造方法私有,不能创建对象
  • 所有方法都是 static 静态,直接类名调用
  • 内置两个常用常量:
    • Math.E:自然对数底数 ≈ 2.71828
    • Math.PI:圆周率 ≈ 3.14159

2. 常用方法一览表 📋

方法签名 功能说明
public static int abs(int a) 取绝对值(无越界判断)
public static int absExact(int a) 取绝对值(有越界判断,JDK15+)
public static double ceil(double a) 向上取整(进一法)
public static double floor(double a) 向下取整(去尾法)
public static int round(float a) 四舍五入
public static int max(int a,int b) 取两数较大值
public static int min(int a,int b) 取两数较小值
public static double pow(double a,double b) a 的 b 次幂
public static double sqrt(double a) 平方根
public static double cbrt(double a) 立方根
public static double random() 生成 [0.0, 1.0) 随机数

3. 方法细节 + 代码逐行讲解 💻

3.1 绝对值:abs() / absExact()

重点:Integer 最小值坑点!

java 复制代码
// 普通情况
System.out.println(Math.abs(88));   // 88
System.out.println(Math.abs(-88));  // 88

// 🔥 重点坑:int 范围 -2147483648 ~ 2147483647
// -2147483648 没有对应的正数,abs 会直接返回负数!
System.out.println(Math.abs(-2147483648)); // -2147483648(bug)

// absExact 会判断并抛出异常,更安全
// System.out.println(Math.absExact(-2147483648)); // 抛出 ArithmeticException

absExact 源码思想:

java 复制代码
public static int absExact(int a) {
    if (a == Integer.MIN_VALUE)
        throw new ArithmeticException("溢出");
    else
        return abs(a);
}

✅ 开发建议:对整数取绝对值优先用 absExact,避免隐藏 bug。


3.2 向上取整 ceil()

向数轴正方向进一

java 复制代码
System.out.println(Math.ceil(12.34));  // 13.0
System.out.println(Math.ceil(-12.34)); // -12.0

3.3 向下取整 floor()

向数轴负方向进一

java 复制代码
System.out.println(Math.floor(12.34));  // 12.0
System.out.println(Math.floor(-12.34)); // -13.0

3.4 四舍五入 round()

java 复制代码
System.out.println(Math.round(12.34));  // 12
System.out.println(Math.round(12.54));  // 13
System.out.println(Math.round(-12.34)); // -12
System.out.println(Math.round(-12.54)); // -13

3.5 最大/最小、幂、开方

java 复制代码
// 最大最小
System.out.println(Math.max(20, 30)); // 30
System.out.println(Math.min(20, 30)); // 20

// 幂运算
System.out.println(Math.pow(2, 3));   // 8.0

// 平方根 & 立方根
System.out.println(Math.sqrt(4)); // 2.0
System.out.println(Math.cbrt(8)); // 2.0

3.6 随机数 random() 🔥(高频面试/开发)

需求:生成 [1, 100] 之间的随机整数。

java 复制代码
// 标准公式:(int)(Math.random() * 范围 + 起始)
for (int i = 0; i < 10; i++) {
    int num = (int) (Math.random() * 100 + 1);
    System.out.print(num + " ");
}

推导过程:

  • Math.random()[0.0, 1.0)
  • * 100[0.0, 100.0)
  • +1[1.0, 101.0)
  • 强转 int → [1, 100]

4. 完整测试代码 ✅

java 复制代码
public class MathDemo1 {
    public static void main(String[] args) {
        // 1. 绝对值
        System.out.println(Math.abs(-88));
        System.out.println(Math.abs(-2147483648));
        // System.out.println(Math.absExact(-2147483648));

        // 2. 取整
        System.out.println(Math.ceil(12.34));
        System.out.println(Math.floor(12.34));
        System.out.println(Math.round(12.54));

        // 3. 最大最小
        System.out.println(Math.max(20, 30));
        System.out.println(Math.min(20, 30));

        // 4. 幂与开方
        System.out.println(Math.pow(2, 3));
        System.out.println(Math.sqrt(4));
        System.out.println(Math.cbrt(8));

        // 5. 随机数 [1,100]
        for (int i = 0; i < 10; i++) {
            System.out.print((int) (Math.random() * 100 + 1) + " ");
        }
    }
}

📌 重点总结(面试必背)

  1. Math 是 工具类,不能继承、不能 new,全是静态方法
  2. abs(-2147483648) 会返回负数,优先使用 absExact
  3. ceil 向上、floor 向下、round 四舍五入
  4. 随机数 [a,b] 公式:(int)(Math.random()*(b-a+1)+a)
  5. 常用常量:Math.PIMath.E

✍️ 写在最后

本篇把 Math 类 从结构、方法、坑点、实战一次性讲透,是 Java 基础中高频使用、面试常问的模块。

下一篇我们将学习 System 类,包括:

  • 系统时间戳(性能统计)
  • 数组拷贝 arraycopy
  • 退出 JVM exit
相关推荐
广州灵眸科技有限公司6 分钟前
瑞芯微(EASY EAI)RV1126B yolov11-track多目标跟踪部署教程
linux·开发语言·网络·人工智能·yolo·机器学习·目标跟踪
李白的天不白9 分钟前
大规模请求数据并发问题
java·前端·数据库
智慧物业老杨33 分钟前
智慧物业数智化转型实战:从工单响应到业主满意度的闭环构建
java·开发语言
Kiling_070436 分钟前
Java集合框架:List集合详解与应用
java·开发语言·windows
fan_music1 小时前
C语言如何实现C++的类
开发语言·c++
极客先躯1 小时前
高级java每日一道面试题-2025年12月08日-实战篇[Docker]-如何为 Docker 配置代理?如何为容器配置代理?
java·docker·代理配置的双层架构·docker 守护进程配置代理·为容器配置代理·构建时环境变量·运行时注入环境变量
毋语天1 小时前
Python 常用内置模块详解:日志、随机数、时间、OS 与 JSON
开发语言·python
csdn2015_1 小时前
java springboot 文件导入,判断第一列的值是否有重复
java·windows·spring boot
右耳朵猫AI1 小时前
Python技术周刊 2026年第14周
开发语言·python·okhttp
叼烟扛炮1 小时前
C++ 知识点22 函数模板
开发语言·c++·算法·函数模版