要約
有理数を表すクラスです。
分子・分母を Integer オブジェクトとして保持します。
Rational オブジェクトはリテラルや Kernel.#Rational メソッドによって生成できます。
# 10 進整数に `r` を付けた形式
p -3r # => (-3/1)
# 10 進小数に `r` を付けた形式
p 0.1r # => (1/10)
# Float のリテラル `0.1` と違い、
# 誤差無しで 0.1 を表す Rational オブジェクトが得られる
p 3/4r # => (3/4)
# `3/4r` という形式の Rational のリテラルがあるわけではなく、
# Integer のリテラル `3` と Rational のリテラル `4r` と
# 除算演算子 `/` からなる演算子式
# `3r/4` と書くこともできる
Rational メソッドによる生成
# 分子・分母を引数として与える
p Rational(3, 4) # => (3/4)
# 整数の場合、分母 `1` は略せる
p Rational(3) # => (3/1)
# 分数形式の文字列を与える
p Rational("3/4") # => (3/4)
# 10 進整数、10 進小数の形式の文字列を与える
p Rational("3") # => (3/1)
p Rational("-0.1") # => (-1/10)
Rational.new で生成することはできません(Integer や Float
と同様)。
Rational.new(1, 3) # ~> NoMethodError
Rational オブジェクトは常に既約(それ以上約分できないこと)かつ分母が正であるような分子・分母を保持しています。
p Rational(2, -6) # => (-1/3)
# 計算結果として生じる Rational オブジェクトもそうなっている
p Rational(2, 3) / (-4) # => (-1/6)
目次
- インスタンスメソッド
- private特異メソッド
- privateメソッド
- 追加されるメソッド
継承しているメソッド
- Numericから継承しているメソッド
- Comparableから継承しているメソッド
インスタンスメソッド
self * other -> Rational | Float[permalink][rdoc][edit]-
selfにotherを掛けた値(=積)を返します。Rationalオブジェクトを左項とする算術演算子*はこのメソッドの呼び出しになります。- [PARAM]
other: -
selfに対する乗数
例otherに Float を指定した場合は、計算結果を Float で返します。r = Rational(3, 4) p r * 2 # => (3/2) p r * 4 # => (3/1) p r * 0.5 # => 0.375 p r * Rational(1, 2) # => (3/8) - [PARAM]
self ** other -> Rational | Float[permalink][rdoc][edit]-
selfのother乗を返します。Rationalオブジェクトを左項とする算術演算子**はこのメソッドの呼び出しになります。- [PARAM]
other: -
selfに対する冪指数(べきしすう)
例otherに Float を指定した場合は、計算結果を Float で返します。otherが有理数であっても、計算結果が無理数だった場合は Float を返します。r = Rational(3, 4) p r ** Rational(2, 1) # => (9/16) p r ** 2 # => (9/16) p r ** 2.0 # => 0.5625 p r ** Rational(1, 2) # => 0.8660254037844386計算結果の分母・分子が巨大になりすぎるとき、警告を出したうえで Float::INFINITY(基数によっては Float::NAN)を返します。
計算を放棄して Float::INFINITY を返す例p Rational(2) ** 100000000 # => warning: in a**b, b may be too big # Infinity判定の閾値は変わりえます。
- [PARAM]
self + other -> Rational | Float[permalink][rdoc][edit]-
selfにotherを足した値(=和)を返します。Rationalオブジェクトを左項とする算術演算子+はこのメソッドの呼び出しになります。- [PARAM]
other: -
selfに加算する数値
例otherに Float を指定した場合は、計算結果を Float で返します。r = Rational(3, 4) p r + Rational(1, 2) # => (5/4) p r + 1 # => (7/4) p r + 0.5 # => 1.25 - [PARAM]
self - other -> Rational | Float[permalink][rdoc][edit]-
selfからotherを引いた値(=差)を返します。Rationalオブジェクトを左項とする算術演算子-はこのメソッドの呼び出しになります。- [PARAM]
other: -
selfから減算する数値
例otherに Float を指定した場合は、計算結果を Float で返します。r = Rational(3, 4) p r - 1 # => (-1/4) p r - 0.5 # => 0.25 - [PARAM]
- self -> RationalRuby 1.9.1 から[permalink][rdoc][edit]-
selfの符号を反転させたものを返します。
例Rationalオブジェクトに対する単項演算子-はこのメソッドの呼び出しになります。r = Rational(3, 4) p(- r) # => (-3/4) self / other -> Rational | Float[permalink][rdoc][edit]quo(other) -> Rational | FloatRuby 1.9.3 から-
selfをotherで割った値(=商)を返します。Rationalオブジェクトを左項とする算術演算子/はこのメソッドの呼び出しになります。- [PARAM]
other: -
selfを割る数
例otherに Float を指定した場合は、計算結果を Float で返します。r = Rational(3, 4) p r / 2 # => (3/8) p r / 2.0 # => 0.375 p r / 0.5 # => 1.5 p r / Rational(1, 2) # => (3/2) r / 0 # ~> ZeroDivisionError- [EXCEPTION]
ZeroDivisionError: -
otherが0のときに発生します。
[SEE_ALSO] Numeric#quo
- [PARAM]
self <=> other -> -1 | 0 | 1 | nil[permalink][rdoc][edit]-
selfをotherと比較し、selfがotherより大きければ1を、等しければ0を、小さければ-1を返します。比較できないときはnilを返します。Rationalオブジェクトを左項とする二項演算子<=>はこのメソッドの呼び出しになります。- [PARAM]
other: - 比較対象
p Rational(2, 3) <=> Rational(2, 3) # => 0 p Rational(5) <=> 5 # => 0 p Rational(2, 3) <=> Rational(1,3) # => 1 p Rational(1, 3) <=> 1 # => -1 p Rational(1, 3) <=> 0.3 # => 1 p Rational(1, 3) <=> nil # => nil - [PARAM]
self == other -> bool[permalink][rdoc][edit]-
selfが数値としてotherと等しければtrueを、そうでなければfalseを返します。otherが数値でないときはfalseを返します。Rationalオブジェクトを左項とする比較演算子==はこのメソッドの呼び出しになります。- [PARAM]
other: - 比較対象
p Rational(2, 3) == Rational(2, 3) # => true p Rational(5) == 5 # => true p Rational(0) == 0.0 # => true p Rational('1/3') == 0.33 # => false p Rational('1/2') == '1/2' # => false - [PARAM]
abs -> RationalRuby 1.9.1 から[permalink][rdoc][edit]magnitude -> Rational-
例selfの絶対値(absolute value)を返します。p Rational(1, 2).abs # => (1/2) p Rational(-1, 2).abs # => (1/2) ceil(precision = 0) -> Integer | Rational[permalink][rdoc][edit]-
selfと等しいかより大きな整数のうち最小のものを返します。- [PARAM]
precision: - 計算結果の精度
- [EXCEPTION]
TypeError: -
precisionに整数以外のものを指定すると発生します。
p Rational(3).ceil # => 3 p Rational(2, 3).ceil # => 1 p Rational(-3, 2).ceil # => -1
例precisionを指定した場合は指定した桁数の数値と、上述の性質に最も近い整数か Rational を返します。p Rational('-123.456').ceil(+1) # => (-617/5) p Rational('-123.456').ceil(+1).to_f # => -123.4 p Rational('-123.456').ceil(0) # => -123 p Rational('-123.456').ceil(-1) # => -120[SEE_ALSO] Rational#floor, Rational#round, Rational#truncate
- [PARAM]
coerce(other) -> Array[permalink][rdoc][edit]-
selfとotherが同じクラスになるよう、selfかotherを変換し[other, self]という配列にして返します。- [PARAM]
other: - 比較または変換するオブジェクト
p Rational(1).coerce(2) # => [(2/1), (1/1)] p Rational(1).coerce(2.2) # => [2.2, 1.0] - [PARAM]
denominator -> Integer[permalink][rdoc][edit]-
例selfの分母(denominator)を返します。分母は常に正の整数です。p Rational(7).denominator # => 1 p Rational(7, 1).denominator # => 1 p Rational(9, -4).denominator # => 4 p Rational(-2, -10).denominator # => 5[SEE_ALSO] Rational#numerator
fdiv(other) -> FloatRuby 1.9.3 から[permalink][rdoc][edit]-
selfをotherで割った商を Float で返します。otherに虚数を指定することはできません。- [PARAM]
other: -
selfを割る数
p Rational(2, 3).fdiv(1) # => 0.6666666666666666 p Rational(2, 3).fdiv(0.5) # => 1.3333333333333333 p Rational(2).fdiv(3) # => 0.6666666666666666 p Rational(1).fdiv(Complex(1, 0)) # => 1.0 Rational(1).fdiv(Complex(0, 1)) # ~> RangeError - [PARAM]
floor(precision = 0) -> Integer | Rational[permalink][rdoc][edit]-
selfと等しいかより小さな整数のうち最大のものを返します。- [PARAM]
precision: - 計算結果の精度
- [EXCEPTION]
TypeError: -
precisionに整数以外のものを指定すると発生します。
p Rational(3).floor # => 3 p Rational(2, 3).floor # => 0 p Rational(-3, 2).floor # => -2Rational#to_i とは違う結果を返す事に注意してください。
例p Rational(+7, 4).to_i # => 1 p Rational(+7, 4).floor # => 1 p Rational(-7, 4).to_i # => -1 p Rational(-7, 4).floor # => -2
例precisionを指定した場合は指定した桁数の数値と、上述の性質に最も近い整数か Rational を返します。p Rational('-123.456').floor(+1) # => (-247/2) p Rational('-123.456').floor(+1).to_f # => -123.5 p Rational('-123.456').floor(0) # => -124 p Rational('-123.456').floor(-1) # => -130[SEE_ALSO] Rational#ceil, Rational#round, Rational#truncate
- [PARAM]
hash -> Integer[permalink][rdoc][edit]-
selfのハッシュ値を返します。[SEE_ALSO] Object#hash
inspect -> String[permalink][rdoc][edit]-
selfを人間が読みやすい形の文字列表現にして返します。"(3/5)","(-17/7)"のように10進数の表記を返します。- [RETURN]
- 有理数の表記にした文字列を返します。
p Rational(5, 8).inspect # => "(5/8)" p Rational(2).inspect # => "(2/1)" p Rational(-8, 6).inspect # => "(-4/3)" p Rational(0.5).inspect # => "(1/2)"[SEE_ALSO] Rational#to_s
negative? -> boolRuby 2.3.0 から[permalink][rdoc][edit]-
例selfが負の数ならtrueを、そうでないならfalseを返します。p Rational(1, 2).negative? # => false p Rational(-1, 2).negative? # => true[SEE_ALSO] Rational#positive?
numerator -> Integer[permalink][rdoc][edit]-
例selfの分子(numerator)を返します。p Rational(7).numerator # => 7 p Rational(7, 1).numerator # => 7 p Rational(9, -4).numerator # => -9 p Rational(-2, -10).numerator # => 1[SEE_ALSO] Rational#denominator
positive? -> boolRuby 2.3.0 から[permalink][rdoc][edit]-
例selfが正の数ならtrueを、そうでないならfalseを返します。p Rational(1, 2).positive? # => true p Rational(-1, 2).positive? # => false[SEE_ALSO] Rational#negative?
rationalize(eps = 0) -> RationalRuby 1.9.3 から[permalink][rdoc][edit]-
selfからepsで指定した許容誤差の範囲に収まるような Rational を返します。epsを省略した場合はselfを返します。- [PARAM]
eps: - 許容する誤差
r = Rational(5033165, 16777216) p r.rationalize # => (5033165/16777216) p r.rationalize(Rational(0.01)) # => (3/10) p r.rationalize(Rational(0.1)) # => (1/3) - [PARAM]
round(precision = 0) -> Integer | Rational[permalink][rdoc][edit]-
selfともっとも近い整数を返します。中央値
0.5,-0.5はそれぞれ1,-1に切り上げされます。- [PARAM]
precision: - 計算結果の精度
- [EXCEPTION]
TypeError: -
precisionに整数以外のものを指定すると発生します。
p Rational(3).round # => 3 p Rational(2, 3).round # => 1 p Rational(-3, 2).round # => -2
例precisionを指定した場合は指定した桁数の数値と、上述の性質に最も近い整数か Rational を返します。p Rational('-123.456').round(+1) # => (-247/2) p Rational('-123.456').round(+1).to_f # => -123.5 p Rational('-123.456').round(0) # => -123 p Rational('-123.456').round(-1) # => -120 p Rational('-123.456').round(-2) # => -100[SEE_ALSO] Rational#ceil, Rational#floor, Rational#truncate
- [PARAM]
to_f -> Float[permalink][rdoc][edit]-
selfの値を最も良く表現する Float に変換します。絶対値が極端に小さい、または大きい場合にはゼロや正負の無限大が返ることがあります。
- [RETURN]
- Float を返します。
p Rational(2).to_f # => 2.0 p Rational(9, 4).to_f # => 2.25 p Rational(-3, 4).to_f # => -0.75 p Rational(20, 3).to_f # => 6.666666666666667 p Rational(1, 10**1000).to_f # => 0.0 p Rational(-1, 10**1000).to_f # => -0.0 p Rational(10**1000).to_f # => Infinity p Rational(-10**1000).to_f # => -Infinity to_i -> Integer[permalink][rdoc][edit]truncate(precision = 0) -> Rational | Integer-
小数点以下を切り捨てて値を整数に変換して返します。
- [PARAM]
precision: - 計算結果の精度
- [EXCEPTION]
TypeError: -
precisionに整数以外のものを指定すると発生します。
p Rational(2, 3).to_i # => 0 p Rational(3).to_i # => 3 p Rational(300.6).to_i # => 300 p Rational(98, 71).to_i # => 1 p Rational(-31, 2).to_i # => -15
例precisionを指定した場合は指定した桁数で切り捨てた整数か Rational を返します。p Rational('-123.456').truncate(+1) # => (-617/5) p Rational('-123.456').truncate(+1).to_f # => -123.4 p Rational('-123.456').truncate(0) # => -123 p Rational('-123.456').truncate(-1) # => -120[SEE_ALSO] Rational#ceil, Rational#floor
- [PARAM]
to_r -> Rational[permalink][rdoc][edit]-
例selfを返します。p Rational(3, 4).to_r # => (3/4) p Rational(8).to_r # => (8/1) to_s -> String[permalink][rdoc][edit]-
selfを人間が読みやすい形の文字列表現にして返します。"3/5","-17/7"のように10進数の表記を返します。- [RETURN]
- 有理数の表記にした文字列を返します。
p Rational(3, 4).to_s # => "3/4" p Rational(8).to_s # => "8/1" p Rational(-8, 6).to_s # => "-4/3" p Rational(0.5).to_s # => "1/2"[SEE_ALSO] Rational#inspect
private特異メソッド
convert(*arg) -> RationalRuby 3.0 から[permalink][rdoc][edit]-
引数を有理数(Rational)に変換した結果を返します。
- [PARAM]
arg: - 変換対象のオブジェクトです。
Kernel.#Rational の本体です。
[SEE_ALSO] Kernel.#Rational
- [PARAM]
privateメソッド
marshal_dump -> ArrayRuby 1.9.3 から[permalink][rdoc][edit]-
Marshal.#load のためのメソッドです。
Rational::compatible#marshal_loadで復元可能な配列を返します。[注意]
Rational::compatibleは通常の方法では参照できません。
追加されるメソッド
json_create(hash) -> RationalRuby 2.1.0 から[permalink][rdoc][edit] [added by json/add/rational]-
JSON のオブジェクトから Rational のオブジェクトを生成して返します。
- [PARAM]
hash: - 分子をキー 'n'、分母をキー 'd' に持つハッシュを指定します。
- [PARAM]
to_d(nFig) -> BigDecimal[permalink][rdoc][edit] [added by bigdecimal/util]-
自身を BigDecimal に変換します。
nFig 桁まで計算を行います。
- [PARAM]
nFig: - 計算を行う桁数
- [RETURN]
- BigDecimal に変換したオブジェクト
- [EXCEPTION]
ArgumentError: - nFig に 0 以下を指定した場合に発生します。
require "bigdecimal" require "bigdecimal/util" p (1/3r).to_d(3) # => 0.333e0 p (1/3r).to_d(10) # => 0.3333333333e0 - [PARAM]
to_json(*args) -> StringRuby 2.1.0 から[permalink][rdoc][edit] [added by json/add/rational]-
自身を JSON 形式の文字列に変換して返します。
内部的にはハッシュにデータをセットしてから JSON::Generator::GeneratorMethods::Hash#to_json を呼び出しています。
- [PARAM]
args: - 引数はそのまま JSON::Generator::GeneratorMethods::Hash#to_json に渡されます。
require 'json/add/rational' p (1/3r).to_json # => "{\"json_class\":\"Rational\",\"n\":1,\"d\":3}" - [PARAM]