Rationalクラス

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の場合はエラーとなり、例外が投げられます。