Rationalは、有理数の値を格納できるオブジェクトのクラスです。格納できる整数の範囲に制限は無く、非常に桁数の大きな数でも誤差無しに格納することができます。Rationalには四則演算やその他の様々なメソッドが用意されています。Rationalの四則演算には「+」や「-」といった演算子は使えず、かわりに「add」「sub」といったメソッドを使用しなければなりません。
Rationalへの変換. Rationalクラスのメソッドの引数などでは、Rational以外の値からRationalへ自動的に変換される場合があります。そのような変換は次のような規則に則っておこなわれます。
Rationalへの変換がエラーになった場合には例外が投げられます。
自動丸め処理. Rationalには、値を特定のスケールに自動的に丸める機能があります。既定ではRationalの自動丸め処理は無効になっていますが、setScale()メソッドを呼ぶとそのオブジェクトの自動丸め処理が有効になり、そのオブジェクトに有理数が格納される際にはスケールの整数倍に丸められるようになります。setScale()の引数に指定された整数値の逆数がそのオブジェクトのスケールになります。たとえば「x.setScale(1000)」とするとxのスケールは1/1000となり、xに格納される値は常に1/1000の倍数に丸められます。丸めの処理には「偶数丸め」が用いられます。
表 3. Rationalクラス
| 機能 | 書式 | 説明 |
|---|---|---|
| Rationalオブジェクトの作成 | new Rational() | 新しくRationalオブジェクトを作成します。作成されたRationalの値は0になります。 |
| Rationalオブジェクトの作成 | new Rational(x) | 変数xの内容をもとにして新しくRationalオブジェクトを作成します。変数xの値はRationalに変換可能でなくてはなりません。 |
| 複製 | x.clone() | Rationalオブジェクトを複製して新しくRationalオブジェクトを作成し、そのオブジェクトを返します。xにスケールが設定されていた場合はそのスケールも引き継がれます。 |
| 代入 | r.set(x) | 変数xの値をrに代入します。変数xの値はIntegerに変換可能でなくてはなりません。 |
| 文字列へ変換 | x.toString() x.toString(base) | 変数xの指すRationalオブジェクトの値を文字列へ変換した値を返します。引数baseには2から36までの整数(またはそれに変換できる値)を指定することができ、指定されるとその進数表記の文字列を返します。引数が指定されなかった場合は10進表記の文字列を返します。返される文字列は、その値が整数の場合は「789」のような整数表記になり、そうでない場合は「123/45」のような分数表記になります。ただし、そのオブジェクトにスケールが設定されている場合は常に分数表記になり、その分母はスケールの値になります(そのため既約分数でないこともあります)。 |
| 小数部分付きの文字列へ変換 | x.toStringRound(base, scaleexp) | 変数xの指すRationalオブジェクトの値を「123.45」のような小数部分の付いた文字列へ変換します。引数baseには2から36までの整数(またはそれに変換できる値)を指定します。引数scaleexpには0以上の整数(またはそれに変換できる値)を指定します。変換によって得られる文字列は、引数baseで指定される進数表記の、小数点以下の桁数がscaleexpで指定される値であるようなものになります。そのような表記でもとの値を正確に表現できない場合には、「偶数丸め」によって丸められます。 |
| intに変換可能か調べる | x.fitsInt() | 変数xの指すRationalオブジェクトの値が、int型に収まる範囲の整数であるかどうかをテストし、収まる場合はtrueを、そうでない場合はfalseを返します。 |
| intに変換する | x.toInt() | 変数xの指すRationalオブジェクトの値をintに変換し、その値を返します。値がintに収まる範囲の整数ではない場合には例外が投げられます。 |
| 交換 | x.swap(y) | 変数xと変数yのそれぞれが指すRationalオブジェクトの値を入れ替えます。それぞれのRationalオブジェクトに設定されたスケールは入れ替わりません。 |
| 交換 | x.swap(num,den) | 変数xが指すRationalオブジェクトの値である有理数と、変数numとdenのそれぞれが指すIntegerオブジェクトの値を分子分母とする有理数の値を入れ替えます。 |
| スケールを設定する | x.setScale(y) | 変数xが指すRationalオブジェクトにスケールを設定します。引数yはIntegerに変換可能でなくてはなりません。またyの値は0以上でなくてはなりません。yが1以上の場合は変数xが指すRationalオブジェクトの自動丸めが有効になり、yが0の場合は自動丸めが無効になります。 |
| 整数に丸める | x.roundHalf(y) | 変数xが指すRationalオブジェクトの値を、引数yの逆数の倍数になるように「偶数丸め」によってまるめ、その結果をxが指すRationalオブジェクト自身に格納します。式の値としてx自身を返します。 |
| 符号を得る | x.sign() | 変数xの指すRationalオブジェクトの値が正、負、0の場合にそれぞれ1、-1、0を返します。 |
| 整数かどうかテストする | x.fitsInteger() | 変数xの指すRationalオブジェクトの値が整数であればtrueを、そうでないならfalseを返します。 |
| 分子と分母を得る | x.getNum(y) x.getDen(y) | 変数xの指すRationalオブジェクトの値の分子(getNum)または分母(getDen)を、引数yの指すIntegerオブジェクトに格納します。式の値としてx自身を返します。 |
| 分子や分母がintに収まるかどうかテストする | x.numFitsInt() x.denFitsInt() | 変数xの指すRationalオブジェクトの値の分子(numFitsInt)または分母(denFitsInt)が、intの範囲に収まるかどうかをテストし、収まる場合はtrueを、そうでない場合はfalseを返します。 |
| 分子や分母をintに変換する | x.getNumInt() x.getDenInt() | 変数xの指すRationalオブジェクトの分子(getNumInt)または分母(getDenInt)をintに変換した値を返します。もしintに変換できない場合は例外が投げられます。 |
| 比較 | x.eq(y) x.ne(y) x.gt(y) x.lt(y) x.ge(y) x.le(y) | xとyを比較し、それぞれ、等しい(eq)、異なる(ne)、xがyより大きい(gt)、xがyより小さい(lt)、xがy以上(ge)、xがy以下(le)のときにtrueを返し、そうでない場合はfalseを返します。yはRationalに変換可能でなくてはなりません。 |
| 四則演算 | x.add(y) x.sub(y) x.mul(y) x.div(y) r.add(x, y) r.sub(x, y) r.mul(x, y) r.div(x, y) | 変数xとyを加算(add)、減算(sub)、乗算(mul)、除算(div)します。最初の4つの形式では計算結果をxに、後の4つの形式では計算結果をrに格納します。また式の値として、前者の場合はxを、後者の場合はrを返します。引数はRationalに変換可能でなくてはなりません。また除算については除数が0の場合にはエラーとなり、例外が投げられます。 |
| 絶対値と符号の反転 | x.abs() x.neg() r.abs(x) r.neg(x) | absは与えられた値の絶対値を求め、negは与えられた値の符号を反転した値を求めます。最初の2つの形式(引数の無い形式)はxの絶対値や符号反転値をx自身に格納し、後ろの2つの形式(引数のある形式)はxの絶対値や符号反転値をrに格納します。後者の形式ではxはRationalに変換可能でなくてはなりません。 |
| 逆数 | x.inv() r.inv(x) | xの値の逆数を計算し、x(前者の形式)またはr(後者の形式)の指す先のRationalオブジェクトに格納します。後者の形式ではxはRationalに変換可能でなくてはなりません。xが0の場合はエラーとなり、例外が投げられます。 |