The documentation for the FRotator.Equals() function states:
* Checks whether two rotators are equal within specified tolerance, when treated as an orientation.
* This means that FRotator(0, 0, 360).Equals(FRotator(0,0,0)) is true, because they represent the same final orientation.
However, the following code demonstrates a different behavior:
FRotator R1(49.9, -69.9, -109.9);
FRotator R2(130.0f, 110.0f, 70.0f);
float Tolerance = 40.0f;
bool Equal = R1.Equals(R2, Tolerance); // returns false (wrong!!!)
bool QuatEqual = FQuat(R1).Equals(FQuat(R2), Tolerance); // returns true (correct)
Essentially, the UE4 code which checks for FRotator equality does not consider the possibility of 180-degree flips cancelling out in the different pitch / yaw / roll components even though the result is the same orientation. The UE4 FQuat code, on the other hand, doesn’t have this problem as demonstrated above.