public static Rational valueOf(BigDecimal x) { BigInteger num = x.unscaledValue(); BigInteger den = BigInteger.ONE; int scale = x.scale(); while (scale > 0) { den = den.multiply(BigInteger.TEN); --scale; } while (scale < 0) { num = num.multiply(BigInteger.TEN); ++scale; } Rational rv = new Rational(num, den); rv.reduce(); return rv; }