]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/drew/jpeg/Rational.java
78bd72b3d281bf62135e4c5a6f53f6c87e01ebe5
[GpsPrune.git] / tim / prune / drew / jpeg / Rational.java
1 package tim.prune.drew.jpeg;\r
2 \r
3 /**\r
4  * Immutable class for holding a rational number without loss of precision.\r
5  * Based on Drew Noakes' Metadata extractor at http://drewnoakes.com\r
6  */\r
7 public class Rational\r
8 {\r
9         /** Holds the numerator */\r
10         private final int _numerator;\r
11 \r
12         /** Holds the denominator */\r
13         private final int _denominator;\r
14 \r
15         /**\r
16          * Constructor\r
17          * @param inNumerator numerator of fraction (upper number)\r
18          * @param inDenominator denominator of fraction (lower number)\r
19          */\r
20         public Rational(int inNumerator, int inDenominator)\r
21         {\r
22                 // Could throw exception if denominator is zero\r
23                 _numerator = inNumerator;\r
24                 _denominator = inDenominator;\r
25         }\r
26 \r
27 \r
28         /**\r
29          * @return the value of the specified number as a <code>double</code>.\r
30          * This may involve rounding.\r
31          */\r
32         public double doubleValue()\r
33         {\r
34                 if (_denominator == 0) return 0.0;\r
35                 return (double)_numerator / (double)_denominator;\r
36         }\r
37 \r
38         /**\r
39          * @return the value of the specified number as an <code>int</code>.\r
40          * This may involve rounding or truncation.\r
41          */\r
42         public final int intValue()\r
43         {\r
44                 if (_denominator == 0) return 0;\r
45                 return _numerator / _denominator;\r
46         }\r
47 \r
48         /**\r
49          * @return the denominator.\r
50          */\r
51         public final int getDenominator()\r
52         {\r
53                 return _denominator;\r
54         }\r
55 \r
56         /**\r
57          * @return the numerator.\r
58          */\r
59         public final int getNumerator()\r
60         {\r
61                 return _numerator;\r
62         }\r
63 \r
64         /**\r
65          * Checks if this rational number is an Integer, either positive or negative.\r
66          */\r
67         public boolean isInteger()\r
68         {\r
69                 // number is integer if the denominator is 1, or if the remainder is zero\r
70                 return (_denominator == 1\r
71                         || (_denominator != 0 && (_numerator % _denominator == 0)));\r
72         }\r
73 \r
74 \r
75         /**\r
76          * @return a string representation of the object of form <code>numerator/denominator</code>.\r
77          */\r
78         public String toString()\r
79         {\r
80                 return "" + _numerator + "/" + _denominator;\r
81         }\r
82 \r
83 \r
84         /**\r
85          * Compares two <code>Rational</code> instances, returning true if they are equal\r
86          * @param inOther the Rational to compare this instance to.\r
87          * @return true if instances are equal, otherwise false.\r
88          */\r
89         public boolean equals(Rational inOther)\r
90         {\r
91                 // Could also attempt to simplify fractions to lowest common denominator before compare\r
92                 return _numerator == inOther._numerator && _denominator == inOther._denominator;\r
93         }\r
94 }