Java Math类是不可实例化的静态工具类,所有方法通过Math.xxx()调用,底层多为native实现;平方用x*x、开方用Math.sqrt(x)、立方根用Math.cbrt(x);hypot防溢出;floor/ceil/round语义及返回类型不同;三角函数参数为弧度,需用toRadians转换,且注意浮点误差。

Java 的 Math 类不是“可扩展的工具类”,而是一个严格设计的、不可实例化的静态工具类,所有方法都通过 Math.xxx() 直接调用,且底层大量使用 native 实现以保证性能和 IEEE 754 合规性。
基本四则与幂/根运算:别用 Math.pow() 算平方或开方
Math.pow(double, double) 是通用幂函数,但对整数小指数(如平方、立方、开方)性能差、精度略低,且可能触发 NaN(比如 pow(-1, 0.5))。
- 求平方优先用
x * x;求平方根用Math.sqrt(x)(比pow(x, 0.5)快 3–5 倍,且处理负数更明确) - 求立方根用
Math.cbrt(x),它专为三次根优化,比pow(x, 1.0/3)更准、更快、支持负数 -
Math.hypot(x, y)计算 √(x²+y²),能避免中间结果溢出(比如x=1e200时,sqrt(x*x + y*y)会得Infinity,而hypot仍可返回合理值)
取整与舍入:区分 floor/ceil/round 的语义和返回类型
它们行为差异明显,且返回类型不同——这常导致隐式类型转换错误:
-
Math.floor(double)→double,向下取整(≤ 输入的最大整数),如floor(-2.7)得-3.0 -
Math.ceil(double)→double,向上取整(≥ 输入的最小整数),如ceil(-2.7)得-2.0 -
Math.round(float)→int;Math.round(double)→long;本质是floor(x + 0.5),但注意负数:round(-2.5)是-2(四舍五入到最近偶数?不,Java 的round是“加 0.5 后 floor”,所以-2.5 + 0.5 = -2.0 → floor = -2.0 → long = -2)
三角与指数函数:注意单位制和特殊值边界
所有三角函数(sin、cos、tan 等)参数单位是**弧度**,不是角度;传错单位是高频 bug。
媒体包提供了可管理各种媒体类型的类。这些类可提供用于执行音频和视频操作。除了基本操作之外,还可提供铃声管理、脸部识别以及音频路由控制。本文说明了音频和视频操作。 本文旨在针对希望简单了解Android编程的初学者而设计。本文将指导你逐步开发使用媒体(音频和视频)的应用程序。本文假定你已安装了可开发应用程序的Android和必要的工具,同时还假定你已熟悉Java或掌握面向对象的编程概念。感兴趣的朋友可以过来看看
立即学习“Java免费学习笔记(深入)”;
- 角度转弧度:用
Math.toRadians(deg),而非手动 × π/180(后者丢失精度) -
Math.sin(Math.PI)不等于 0,而是约1.2246467991473532e-16(浮点误差),比较时勿用== 0,应判断Math.abs(x) -
Math.exp(x)和Math.log(x)底数是e;Math.log10(x)才是常用对数;log(0)得-Infinity,log(-1)得NaN
随机与比较:用 Math.random() 要小心线程安全和范围
Math.random() 返回的是 [0.0, 1.0) 的 double,但它内部用的是单个共享 Random 实例,高并发下有竞争,且无法设 seed。
- 生成 [0, n) 的整数:用
(int)(Math.random() * n),注意n不能太大(超过2^53时精度丢失,可能漏值) - 需要可重现、线程安全或控制 seed 的场景,直接用
new Random(seed)或ThreadLocalRandom.current() - 比较两个
double是否相等?别用==;Math.equals(a, b)是 null-safe 的引用比较,**不适用于 double 值比较**;该用Double.compare(a, b) == 0或自定义 epsilon 判断
真正容易被忽略的,是 Math 类里所有方法对 NaN 和无穷大的定义——比如 Math.max(1.0, Double.NaN) 返回 NaN,而 Math.max(1.0, Double.POSITIVE_INFINITY) 返回 Infinity。一旦输入来源不可控(如用户输入、网络数据),这些边界值会悄无声息地污染后续计算。









