Math.hypot() 是 Java 中安全计算欧几里得距离的方法,通过缩放算法避免平方溢出或下溢,支持多维嵌套调用,NaN/Infinity 输入有明确定义,安全性优于 Math.sqrt(xx + yy)。
math.hypot() 是 java 中专为安全计算欧几里得距离设计的工具方法,它能自动避免因直接平方导致的中间值溢出(如 double.max_value 的平方会变成 infinity),同时保持数值稳定性。
为什么不用 Math.sqrt(x*x + y*y)?
直接用 Math.sqrt(x*x + y*y) 在处理极大或极小浮点数时容易出错:
- 若
x或y接近Double.MAX_VALUE(约 1.8e308),其平方会溢出为Infinity,结果错误; - 若
x和y都极小(如 1e-200),平方后可能下溢为 0,丢失精度; -
Math.hypot()内部采用缩放算法(例如先提取最大绝对值因子,再归一化计算),规避了这些问题。
基本用法:两点间二维欧氏距离
给定两点 (x1, y1) 和 (x2, y2),距离为:
double distance = Math.hypot(x2 - x1, y2 - y1);
例如:
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
double d = Math.hypot(1e200, 1e200); // 返回约 1.414e200,而非 Infinity
扩展到多维空间(如三维)
Math.hypot() 支持两个参数,但可通过嵌套调用支持任意维度:
- 三维:
Math.hypot(x, Math.hypot(y, z)) - 四维:
Math.hypot(w, Math.hypot(x, Math.hypot(y, z))) - 更清晰的做法是封装成工具方法,例如:
static double hypot(double... coords) {<br> double sum = 0;<br> for (double c : coords) sum = Math.hypot(sum, c);<br> return sum;<br>}
注意:该累加方式等价于 √(c₁² + c₂² + … + cₙ²),且全程保持防溢出特性。
边界情况与注意事项
- 任一参数为
NaN→ 结果为NaN; - 任一参数为无穷大(
±Infinity)→ 结果为Infinity; - 全为零 → 返回 0.0;
- 性能略低于直接平方开方,但安全性优先级更高,尤其在科学计算、几何引擎或用户输入不可控场景中应默认使用。

















