You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Math.asin()仅返回0.0问题求助:代码异常原因排查

问题原因与解决方案

嗨,这绝对不是Java的已知Bug,是咱们在整数除法上的小疏漏导致的😉

核心问题:整数除法的陷阱

你写的1 / 2在Java里属于整数除法——当两个int类型的数值做除法时,结果会直接舍弃小数部分取整,所以1 / 2的结果不是0.5,而是0!

当你把0传入Math.asin()时,返回的是0弧度,再通过Math.toDegrees()转换后自然就是0.0了,这就解释了为什么无论你用什么整数做除法,结果都是0.0。

修正方案

只需要把除法运算中的任意一个数改成浮点数,让运算结果变成double类型即可:

// 两种写法都可以,只要有一个操作数是浮点数
System.out.println(Math.toDegrees(Math.asin(1.0 / 2)));
// 或者
System.out.println(Math.toDegrees(Math.asin(1 / 2.0)));

运行这段代码,就能得到你预期的30.0结果啦。

针对游戏夹角计算的额外建议

你提到要用asin()计算游戏中两个对象中心点的夹角,这里额外提醒两点:

  • Math.asin()的参数必须在[-1, 1]范围内,超出会抛出IllegalArgumentException,计算时要注意边界处理;
  • 如果需要获取全象限的角度(比如0°到360°),Math.atan2(y, x)会更合适。假设两个点的坐标差为dy(y方向差值)和dx(x方向差值),可以这样写:
    double angle = Math.toDegrees(Math.atan2(dy, dx));
    // 如果需要把负角度转为正角度(比如-90°转为270°)
    if (angle < 0) {
        angle += 360;
    }
    
    这样能得到更符合游戏场景的完整角度值。

内容的提问来源于stack exchange,提问作者MadCat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:44:09