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.5
degrees per minute - The minute hand moves at the rate of of
6
degrees 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
.