如何将数字限制在一个范围内

时间:2010-11-20 20:19:43

标签: java math

我有这个功能将旋转限制在0.0到360.0的范围内:

private float ClampRotation( float rotation ) {

    while( rotation < 0.0f ) rotation += 360.0f;
    while( rotation >= 360.0f ) rotation -= 360.0f;

    return rotation;

}

这个函数效果很好,它可能效率不高,但我只是想知道是否有一个本机Java函数可以做同样的事情?

我得到的最接近的是Math.min / max,但它不能正常工作。 -10.0的旋转应该输出350.0而不是0.0,因为min / max会这样做。

4 个答案:

答案 0 :(得分:4)

%(模数)适用于浮点值,因此请使用rotation % 360.0f(之后需要将360.0添加到负数)

答案 1 :(得分:4)

使用模数运算符,然后使用小于0的值;

private float ClampRotation( float rotation ) {

    rotation = rotation % 360f;

    if (rotation < 0f) rotation += 360f;

    return rotation;

}

答案 2 :(得分:3)

这只是数学......你可以这样做:

private float ClampRotation( float rotation ) {

    return rotation+360.0f*Math.ceil(-rotation/360.0f);

}

我很确定没关系

答案 3 :(得分:1)

你有传统的缠绕角度,它比所需范围小一个数量级。

对于浮点模数有点奇怪 - 它为负数返回负数,所以你仍然必须有一个分支,它涉及一个除法,这在一些机器上比较慢(因为我没有找到一台机器在哪里%比使用两次或三次减法的循环要便宜得多。

如果您的值在-1000到+1000之间,那么您的版本更清晰,更快。如果您的值比这更宽,请选择基于模数的版本。如果它非常重要,请使用您要使用的值范围在硬件上进行测试。