It turns out that Wikipedia does have the best answer:
// h = 1..12, m = 0..59
static double angle(int h, int m) {
double hAngle = 0.5D * (h * 60 + m);
double mAngle = 6 * m;
double angle = Math.abs(hAngle - mAngle);
angle = Math.min(angle, 360 - angle);
return angle;
}
Basically:
- The hour hand moves at the rate of
0.5degrees per minute - The minute hand moves at the rate of of
6degrees per minute
Problem solved.
And precision isn’t a concern because the fractional part is either .0 or .5, and in the range of 0..360, all of these values are exactly representable in double.