+package tim.prune.jpeg.drew;\r
+\r
+/**\r
+ * Immutable class for holding a rational number without loss of precision.\r
+ * Based on Drew Noakes' Metadata extractor at http://drewnoakes.com\r
+ */\r
+public class Rational\r
+{\r
+ /** Holds the numerator */\r
+ private final int _numerator;\r
+\r
+ /** Holds the denominator */\r
+ private final int _denominator;\r
+\r
+ /**\r
+ * Constructor\r
+ * @param inNumerator numerator of fraction (upper number)\r
+ * @param inDenominator denominator of fraction (lower number)\r
+ */\r
+ public Rational(int inNumerator, int inDenominator)\r
+ {\r
+ // Could throw exception if denominator is zero\r
+ _numerator = inNumerator;\r
+ _denominator = inDenominator;\r
+ }\r
+\r
+\r
+ /**\r
+ * @return the value of the specified number as a <code>double</code>.\r
+ * This may involve rounding.\r
+ */\r
+ public double doubleValue()\r
+ {\r
+ if (_denominator == 0) return 0.0;\r
+ return (double)_numerator / (double)_denominator;\r
+ }\r
+\r
+ /**\r
+ * @return the value of the specified number as an <code>int</code>.\r
+ * This may involve rounding or truncation.\r
+ */\r
+ public final int intValue()\r
+ {\r
+ if (_denominator == 0) return 0;\r
+ return _numerator / _denominator;\r
+ }\r
+\r
+ /**\r
+ * @return the denominator.\r
+ */\r
+ public final int getDenominator()\r
+ {\r
+ return _denominator;\r
+ }\r
+\r
+ /**\r
+ * @return the numerator.\r
+ */\r
+ public final int getNumerator()\r
+ {\r
+ return _numerator;\r
+ }\r
+\r
+ /**\r
+ * Checks if this rational number is an Integer, either positive or negative\r
+ * @return true if an integer\r
+ */\r
+ public boolean isInteger()\r
+ {\r
+ // number is integer if the denominator is 1, or if the remainder is zero\r
+ return (_denominator == 1\r
+ || (_denominator != 0 && (_numerator % _denominator == 0)));\r
+ }\r
+\r
+\r
+ /**\r
+ * @return a string representation of the object of form <code>numerator/denominator</code>.\r
+ */\r
+ public String toString()\r
+ {\r
+ return "" + _numerator + "/" + _denominator;\r
+ }\r
+\r
+\r
+ /**\r
+ * Compares two <code>Rational</code> instances, returning true if they are equal\r
+ * @param inOther the Rational to compare this instance to.\r
+ * @return true if instances are equal, otherwise false.\r
+ */\r
+ public boolean equals(Rational inOther)\r
+ {\r
+ // Could also attempt to simplify fractions to lowest common denominator before compare\r
+ return _numerator == inOther._numerator && _denominator == inOther._denominator;\r
+ }\r
+}
\ No newline at end of file