ところで分数というのはその性質上、分母と分子の両方、もしくはどちらかが0 であった場合について最初に考えておかないといけないような気がします。
うっかり0 で割るような処理を走らせてしまうとエラーになってしまいますから。
場合分けとしては、以下のような感じで良いのでしょうか。
- 分母が0 :分子の値が何であろうと無限大扱い
- 分子が0 :分母の値が何であろうと0 扱い
- 両方が0 :どうしよう。NULL 扱いにしましょうか?
上記に加えて、分母と分子が共に1 であるような分数(=1ですが)も予め定義しておくと便利かも知れません。
ということで、Fraction モジュールの定数として、上記4つを定義しておこうかと思います。
public static final Fraction NULL = new Fraction(0, 0); public static final Fraction ZERO = new Fraction(0, 1); public static final Fraction INFINITY = new Fraction(1, 0); public static final Fraction ONE = new Fraction(1, 1);
その他にも、その分数が無限大かゼロかをチェックできるような関数を作っておくと、後々便利かも知れませんのでついでにつけておきます。
→ソースコード
public boolean isZero(){return (numerator == 0);} public boolean isInfinity(){return (denominator == 0);}
さて、これらを使ったサンプルコードをFractionTest モジュールに記述して試してみます。
→ソースコード
上記の結果は、以下のようになりますね。
result: 1/2 [false, false] result: 0/0 [true, true] result: 0/1 [true, false] result: 1/0 [false, true] result: 1/1 [false, false]
Fraction.ZERO はisZero() 関数がtrue(真)に、Fraction.INFINITY はisInfinity() 関数がtrue になり、Fraction.NULL はそのどちらもがtrue になります。
通常の分数については、どちらもfalse(偽)になりますから、もしもそれらを区別する必要がある場合(割り算とか掛け算とかで、そういう場面に出会いそうです)、事前にチェックすることになると思います。