Given a string representing a decimal point literal (ex. "0.25"), the number it represents is guaranteed to be rational. It seems appropriate for Ratio to parse such strings.

readDecimalRatio :: (Integral a, Read a) => ReadPrec (Ratio a)
readDecimalRatio = parens $ do
Number x <- lexP
return (numberToRational x)

Combine this by (+++) with the original `readPrec` from the instance Read Ratio.