Is there a reason to not allow '.' as a separator for Rational's Read instance, so that both "1%2" and "0.5" can be read?
While it would make read :: String -> Rational more convenient, I'm not sure it would be a good idea to have read accept input that will never be produced by show :: Rational -> String.
As an alternative, you can use readFloat [1] in Numeric.