Math.toRadians和Math.toDegrees仅做角度与弧度的线性换算,不参与三角计算;Math.sin等函数只接受弧度,需先转换再调用;反复转换或对无量纲值误转属典型错误;官方方法语义清晰且JDK 9+有性能优化;浮点误差属正常现象,应避免直接用==比较。

Java里Math.toRadians和Math.toDegrees到底怎么用
这两个函数就是干一件事:在角度(°)和弧度(rad)之间做线性换算,没有魔法,也不涉及三角计算本身。它们只是乘除 Math.PI / 180.0 或 180.0 / Math.PI 的封装。
常见错误是以为调用 Math.sin(30) 就等于 sin(30°),其实不是——Math.sin 等函数只认弧度,传 30 直接算的是 30 弧度(约 1718°),结果完全不对。
- 需要三角函数输入时,必须先用
Math.toRadians转角度为弧度 - 从
Math.atan2等函数拿到弧度结果后,若要显示或调试,再用Math.toDegrees转回来 - 别对中间计算值反复转来转去,比如
Math.toDegrees(Math.sin(Math.toRadians(x)))是典型误用——sin输出是无量纲比值,不是角度
为什么不能手写 angle * Math.PI / 180 而非要用 Math.toRadians
能用,而且结果几乎一样,但官方方法有两点实际优势:
-
Math.toRadians在 JDK 9+ 做了平台相关优化(某些 JVM 会内联为单条 CPU 指令),性能略高一点,尤其在高频循环中 - 语义清晰:看到
Math.toRadians(45)就知道意图是“把 45° 变成弧度”,而45 * Math.PI / 180容易被误读为“随便算个数” - 兼容性无差异,JDK 1.2 就存在,不用担心老环境
遇到精度问题?别怪函数,先看你的使用场景
Math.toRadians 和 Math.toDegrees 本身不引入额外误差,它们只是 double 精度下的常规浮点运算。所谓“转过去再转回来不等于原值”,是浮点数固有特性,不是函数 bug。
立即学习“Java免费学习笔记(深入)”;
比如:Math.toDegrees(Math.toRadians(30)) 可能返回 29.999999999999996,这不是异常,而是 Math.PI 本身是 double 近似值。
- 如果用于 UI 显示,直接
String.format("%.1f°", angle)或四舍五入即可 - 如果用于比较(如判断是否等于 90°),不要用
==,改用Math.abs(a - b) - 别试图用
BigDecimal包裹这两个函数——它们输入输出都是double,强行转类型反而破坏语义和性能
哪些地方最容易漏掉转换
最常翻车的不是数学库本身,而是和外部系统打交道时的单位混淆:
- Android 的
Canvas.rotate(float degrees)接收的是角度,不需要转;但如果你用Math.cos算旋转矩阵,就得自己转弧度 - OpenGL ES / WebGL 的着色器里所有三角函数都要求弧度,Java 层传参前必须过
Math.toRadians - GPS 方向角(heading)通常以角度给出,而某些地图 SDK 的 API 可能要求弧度,文档不细看就容易传错
- Spring 或 Jackson 反序列化 JSON 时,如果字段名含
"angle"但实际存的是弧度,而你默认当角度处理,后续全错
单位不明确的变量名是最危险的,比如叫 rotation 或 theta,不加注释或类型约束,几个月后连你自己都记不清是度还是弧度。










