Tetrix Encoders not returning consistent values

On the robot that my team built, there are two motors with encoders on them. The software running on the NXT brick is written in robotC. It looks like:


// Motor definitions here
task main()
{
  nMotorEncoder[leftArm] = 0;
  nMotorEncoder[rightArm] = 0;
  while (true)
  {
    nxtDisplayTextLine(1,"RArm: %d", nMotorEncoder[rightArm]);
    nxtDisplayTextLine(3,"LArm: %d", nMotorEncoder[leftArm]);
  }
}

If I rotate one of the motors about 90 degrees, the displayed encoder value changes to about -200. If I then rotate the motor back to the position where it was at zero, the encoder value changes to about 250. Since the encoder changes faster in one direction than another, there is no actual ‘zero position’. The other encoder displays this same behavior. Why does this happen?

This can be due to a scratched encoder rotor. Or a nicked encoder wire.

If the scratched encoder rotor is the case, is there any way to fix that?