module function Kernel.#Rational

Rational(x, y = 1, exception: true) -> Rational | nil[permalink][rdoc][edit]

引数を有理数(Rational)に変換した結果を返します。

[PARAM] x:
変換対象のオブジェクトです。
[PARAM] y:
変換対象のオブジェクトです。省略した場合は x だけを用いて Rational オブジェクトを作成します。
[PARAM] exception:
false を指定すると、変換できなかった場合、例外を発生する代わりに nil を返します。
[EXCEPTION] ArgumentError:
変換できないオブジェクトを指定した場合に発生します。

引数 x、y の両方を指定した場合、x/y した Rational オブジェクトを返します。



Rational("1/3")           # => (1/3)
Rational(1, 3)            # => (1/3)
Rational("0.1", "0.3")    # => (1/3)
Rational(Complex(1,2), 2) # => ((1/2)+(1/1)*i)

ただし、1.8系とは異なり、Rational オブジェクトは常に既約(それ以上約分できない状態)である事に注意してください。



Rational(2, 6)         # => (1/3)
Rational(1, 3) * 3     # => (1/1)

引数に文字列を指定する場合、以下のいずれかの形式で指定します。

  • "1/3" のような分数の形式
  • "0.3" のような10進数の形式
  • "0.3E0" のような x.xEn の形式
  • 数字をアンダースコアで繋いだ形式

"1.2/3" のように、分子を実数にする事も可能ですが、分母には指定できません。また、Kernel.#Integer とは違い "0x10" のような進数を表す接頭辞を含めた指定は行えません。



Rational("1/3")        # => (1/3)
Rational("0.3")        # => (3/10)
Rational('0.3E0')      # => (3/10)
Rational('0.1E1/3')    # => (1/3)
Rational('1.2/3')      # => (2/5)
Rational('1/3.1')      # => ArgumentError
Rational('3.0', '3.0') # => (1/1)
Rational('3/3', '3/3') # => (1/1)
Rational('1_234_567')  # => (1234567/1)
Rational(" \n10\t ")   # => (10/1) # 空白類は無視される
Rational("0x10")       # => ArgumentError

引数に変換できないオブジェクトを指定した場合には ArgumentError が発生します。



Rational(Object.new)   # => ArgumentError
Rational("")           # => ArgumentError
Rational(nil)          # => ArgumentError

また、Rational('0.3') と Rational(0.3) は異なるオブジェクトを返す事に注意してください。前者は正確に 3/10 ですが、後者はそうではありません。



Rational('0.3')        # => (3/10)
Rational(0.3)          # => (5404319552844595/18014398509481984)

[SEE_ALSO] Rational