I think I'm homing in on the problem, but my mathematical skills just do not have the capacity to understand how to solve the problem. The long and short of it is that "Quaternion.toAngles()" will not always (in fact, hardly ever) directly translate the rotation back from the rotation created in "Quaternion.fromAngles()".
Example:
Before (degrees): xDeg=15 yDeg=160 zDeg=170
Before (radians): xRad=0.2617994 yRad=2.792527 zRad=2.9670596
After (radians): xRad=-2.8797932 yRad=-0.34906578 zRad=0.17453338
After (degrees): xDeg=-165 yDeg=-20 zDeg=10
You'll notice (maybe) that by adding or subtracting 180 from the "After (degrees)" values, you can get back to the original value. But there doesn't seem to be any consistency on whether it needs subtracting or not. At least, I haven't spotted it yet!
I've created a test class that illustrates the point.