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

Keeping a decimal number within a range

如果我有一个代表一个角的小数,我把它加到另一个角上,如何保证它保持在0°和359°之间?那么如果它是 120° + 270°,它会是 30° 而不是 390°?我可以检查它们是否高于或低于限制,然后加上或减去 360°,但如果最终超过 360° 怎么办?我会使用模数,但我不确定它如何处理小数和负数。我也可以使用 adds/subtracts 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);
    }
}

Demo

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