将十进制数保持在一个范围内

Keeping a decimal number within a range

本文关键字:一个 范围内 十进制数      更新时间:2023-10-16

如果我有一个代表一个角度的十进制数,我把它加到另一个角度,我怎么能确保它保持在0°和359°之间?所以如果是120°+ 270°,就是30°而不是390°?我可以检查它们是否大于或小于极限然后加减360°,但如果结果大于360°呢?我会用模,但我不确定它对小数和负数有什么作用。我也可以使用一个循环,增加/减少360,直到它在范围内,但我不确定这是不是一个好主意。(我实际上是用弧度来做的,用角度来解释更容易)

可以使用模数运算。对于整数,这是%运算符,对于浮点,你可以使用std::fmod

// brief Calculates the sum of two angles
// param[in]  a  First angle [degrees]
// param[in]  b  Second angle [degrees]
// return Sum of two angles [degrees, [0, 360)]
double AddAngles(double a, double b)
{
    const double totalAngle = a + b;
    if (totalAngle >= 0.0)
    {
        return std::fmod(totalAngle, 360.0);
    }
    else
    {
        return 360.0 - std::fmod(-totalAngle, 360.0);
    }
}

演示
int main()
{
    std::cout << AddAngles(30.0, 450.0) << std::endl
              << AddAngles(50.0, 80.0) << std::endl
              << AddAngles(180.0, 180.0) << std::endl
              << AddAngles(-180.0, -270.0) << std::endl;
}

输出
120
130
0
270