Math.hypot 是 Java 中安全精确计算 √(x²+y²) 的方法,通过缩放避免大数溢出和小数精度丢失,内部先取 |x|、|y| 较大者 max,再算 max×√(1+(min/max)²),支持 NaN 和 Infinity 处理。

Math.hypot 是 Java 提供的专门用于计算 √(x² + y²) 的方法,它比直接写 Math.sqrt(x*x + y*y) 更安全、更精确。
为什么不用 Math.sqrt(x*x + y*y)?
直接平方相加再开方,在 x 或 y 很大时容易发生中间结果溢出(比如 Double.MAX_VALUE 的平方远超 double 范围),导致得到 Infinity;很小时又可能因精度丢失算出 0。而 hypot 内部做了缩放处理,避免了这些问题。
hypot 的核心思路是数值稳定计算
它会先找出 |x| 和 |y| 中较大者(记为 max),较小者(记为 min),然后计算:
- 如果 max 是 0,结果就是 0
- 否则计算
max * √(1 + (min/max)²)
这样把大数“提出来”,让括号内始终在 [1, 2) 区间,避免了溢出和下溢,也提升了浮点精度。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
用法很简单,但要注意参数顺序和类型
调用方式:Math.hypot(double x, double y)(也支持 float 版本,但常用 double)
- 参数顺序不重要:hypot(a,b) == hypot(b,a)
- 支持正负值:符号不影响结果(内部取绝对值)
- 任一参数为 NaN,结果为 NaN;任一为无穷大,结果为 Infinity
- 例如:
Math.hypot(3, 4)返回5.0;Math.hypot(1e200, 1e200)不会溢出,返回合理的大数
什么时候该用 hypot?
只要你在算欧氏距离、向量模长、或任何形如 √(x²+y²) 的场景,尤其当 x、y 可能很大、很小、或数量级差异大时,就该优先用 Math.hypot。
日常小整数(比如坐标在几百以内)用 sqrt 也没问题,但养成用 hypot 的习惯更稳妥。

















