将十进制数保持在一个范围内
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);
}
}
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
如果我有一个代表一个角的小数,我把它加到另一个角上,如何保证它保持在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);
}
}
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