Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Numericクラス

class Numeric

クラスの継承リスト: Numeric < Comparable < Object < Kernel

要約

数値を表す抽象クラスです。FixnumFloat などの数値クラスは Numeric のサブクラスとして 実装されています。

演算や比較を行うメソッド(+, -, *, /, <=>)は Numeric のサブクラスで定義されま す。Numeric で定義されているメソッドは、サブクラスで提供されているメソッド (+, -, *, /, %) を利用して定義されるものがほとんどです。 つまり Numeric で定義されているメソッドは、Numeric のサブクラスとして新たに数値クラスを定義した時に、 演算メソッド(+, -, *, /, %, <=>, coerce)だけを定義すれば、数値クラスのそのほかのメソッドが 適切に定義されることを意図して提供されています。

+@, -@ は単項演算子 +, - を表しメソッド定義などではこの記法を利用します。

効率のため Numeric のメソッドと同じメソッドがサブクラスで再定義されている場合があります。

Numeric#coerce メソッドを使うことによって異なる数値クラス間で演算を行うこともできます。

数値関連のメソッドを実際に定義しているクラス一覧

ほとんどの数値関連のメソッドはサブクラスで再定義されています。これは、 効率のためであったり上位抽象クラスで実装を定義することができなかったり するためです。以下の表は 2.1.2 での一覧です。実際にどのメソッドがどのク ラスに定義されているかはそれぞれのクラスを参照してください。

=> ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                     % |     o          -          o          o          o          -          -
                     & |     -          -          o          o          -          -          -
                     * |     -          -          o          o          o          o          o
                    ** |     -          -          o          o          o          o          o
                     + |     -          -          o          o          o          o          o
                    +@ |     o          -          -          -          -          -          -
                     - |     -          -          o          o          o          o          o
                    -@ |     o          -          o          o          o          -          o
                     / |     -          -          o          o          o          o          o
                     < |     -          -          o          o          o          -          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                    << |     -          -          o          o          -          -          -
                    <= |     -          -          o          o          o          -          -
                   <=> |     o          -          o          o          o          o          -
                    == |     -          -          o          o          o          o          o
                   === |     -          -          o          o          o          -          -
                     > |     -          -          o          o          o          -          -
                    >= |     -          -          o          o          o          -          -
                    >> |     -          -          o          o          -          -          -
                    [] |     -          -          o          o          -          -          -
                     ^ |     -          -          o          o          -          -          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                   abs |     o          -          o          o          o          -          o
                  abs2 |     o          -          -          -          -          -          o
                 angle |     o          -          -          -          o          -          o
                   arg |     o          -          -          -          o          -          o
            bit_length |     -          -          o          o          -          -          -
                  ceil |     o          o          -          -          o          o          -
                   chr |     -          o          -          -          -          -          -
                coerce |     o          -          -          o          o          o          o
                  conj |     o          -          -          -          -          -          o
             conjugate |     o          -          -          -          -          -          o
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
           denominator |     o          o          -          -          o          o          o
                   div |     o          -          o          o          -          -          -
                divmod |     o          -          o          o          o          -          -
                downto |     -          o          -          -          -          -          -
                  eql? |     o          -          -          o          o          -          o
                 even? |     -          o          o          o          -          -          -
                  fdiv |     o          -          o          o          o          o          o
               finite? |     -          -          -          -          o          -          -
                 floor |     o          o          -          -          o          o          -
                   gcd |     -          o          -          -          -          -          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                gcdlcm |     -          o          -          -          -          -          -
                  hash |     -          -          -          o          o          o          o
                     i |     o          -          -          -          -          -          -
                  imag |     o          -          -          -          -          -          o
             imaginary |     o          -          -          -          -          -          o
             infinite? |     -          -          -          -          o          -          -
               inspect |     -          -          o          o          o          o          o
              integer? |     o          o          -          -          -          -          -
                   lcm |     -          o          -          -          -          -          -
             magnitude |     o          -          o          o          o          -          o
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                modulo |     o          -          o          o          o          -          -
                  nan? |     -          -          -          -          o          -          -
                  next |     -          o          -          -          -          -          -
              nonzero? |     o          -          -          -          -          -          -
             numerator |     o          o          -          -          o          o          o
                  odd? |     -          o          o          o          -          -          -
                   ord |     -          o          -          -          -          -          -
                 phase |     o          -          -          -          o          -          o
                 polar |     o          -          -          -          -          -          o
                  pred |     -          o          -          -          -          -          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                   quo |     o          -          -          -          o          o          o
           rationalize |     -          o          -          -          o          o          o
                  real |     o          -          -          -          -          -          o
                 real? |     o          -          -          -          -          -          o
                  rect |     o          -          -          -          -          -          o
           rectangular |     o          -          -          -          -          -          o
             remainder |     o          -          -          o          -          -          -
                 round |     o          o          -          -          o          o          -
singleton_method_added |     o          -          -          -          -          -          -
                  size |     -          -          o          o          -          -          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                  step |     o          -          -          -          -          -          -
                  succ |     -          o          o          -          -          -          -
                 times |     -          o          -          -          -          -          -
                  to_c |     o          -          -          -          -          -          o
                  to_f |     -          -          o          o          o          o          o
                  to_i |     -          o          -          -          o          o          o
                to_int |     o          o          -          -          o          -          -
                  to_r |     -          o          -          -          o          o          o
                  to_s |     -          -          o          o          o          o          o
              truncate |     o          o          -          -          o          o          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                  upto |     -          o          -          -          -          -          -
                 zero? |     o          -          o          -          o          -          -
                     | |     -          -          o          o          -          -          -
                     ~ |     -          -          o          o          -          -          -

丸めメソッドの動作一覧

Numeric#ceil, Numeric#floor, Numeric#round, Numeric#truncate のふるまいの違いの表です。左の実数に対して各メソッドを呼ぶと表のような数を 返します。

      |       ceil      floor      round   truncate
----------------------------------------------------
  1.9 |          2          1          2          1
  1.1 |          2          1          1          1
 -1.1 |         -1         -2         -1         -1
 -1.9 |         -1         -2         -2         -1

丸めメソッドの拡張例

切上げはceil, floor を使用して以下のように定義できます。

if n > 0 then
  n.ceil
else
  n.floor
end

また、任意桁の切上げ、切捨て、四捨五入を行うメソッドは以下のように 定義できます。

class Numeric
  def roundup(d=0)
    x = 10**d
    if self > 0
      self.quo(x).ceil * x
    else
      self.quo(x).floor * x
    end
  end

  def rounddown(d=0)
    x = 10**d
    if self < 0
      self.quo(x).ceil * x
    else
      self.quo(x).floor * x
    end
  end

  def roundoff(d=0)
    x = 10**d
    if self < 0
      (self.quo(x) - 0.5).ceil * x
    else
      (self.quo(x) + 0.5).floor * x
    end
  end
end

目次

インスタンスメソッド
+@ -@ <=> abs ceil coerce div divmod eql? fdiv floor integer? modulo nonzero? quo remainder round step to_int truncate zero?

インスタンスメソッド

+ self -> self[permalink][rdoc]

単項演算子の + です。 self を返します。

- self -> Numeric[permalink][rdoc]

単項演算子の - です。 self の符号を反転させたものを返します。

このメソッドは、二項演算子 - で 0 - self によって定義されています。

self <=> other -> -1 | 0 | 1 | nil[permalink][rdoc]

自身が other より大きい場合に 1 を、等しい場合に 0 を、小さい場合には -1 をそれぞれ返します。 自身と other が比較できない場合には nil を返します。

Numeric のサブクラスは、上の動作を満たすよう このメソッドを適切に再定義しなければなりません。

[PARAM] other:
自身と比較したい数値を指定します。
1 <=> 0   #=> 1
1 <=> 1   #=> 0
1 <=> 2   #=> -1
1 <=> "0" #=> nil
abs -> Numeric[permalink][rdoc]

自身が 0 以上ならば self を、そうでない場合は -self を返します。

ceil -> Integer[permalink][rdoc]

自身と等しいかより大きな整数のうち最小のものを返します。

1.ceil        #=> 1
1.2.ceil      #=> 2
(-1.2).ceil   #=> -1
(-1.5).ceil   #=> -1

[SEE_ALSO] Numeric#floor, Numeric#round, Numeric#truncate

coerce(other) -> [Numeric][permalink][rdoc]

自身と other が同じクラスになるよう、自身か other を変換し [other, self] という配列にして返します。

デフォルトでは self と other を Float に変換して [other, self] という配列にして返します。 Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。 以下は Rational の coerce のソースです。other が自身の知らない数値クラスであった場合、 super を呼んでいることに注意して下さい。

# lib/rational.rb より

def coerce(other)
  if other.kind_of?(Float)
    return other, self.to_f
  elsif other.kind_of?(Integer)
    return Rational.new!(other, 1), self
  else
    super
  end
end

数値クラスの算術演算子は通常自分と演算できないクラスをオペランドとして受け 取ると coerce を使って自分とオペランドを変換した上で演算を行います。 以下は Rational の + メソッドを一部省略したものです。 引数が自身の知らない数値クラスである場合、引数の coerce により自身を変換してから + 演算子を呼んでいます。

# lib/rational.rb より

def + (a)
  if a.kind_of?(Rational)
    # 長いので省略
  elsif a.kind_of?(Integer)
    # 長いので省略
  elsif a.kind_of?(Float)
    Float(self) + a
  else
    x, y = a.coerce(self)
    x + y
  end
end
[PARAM] other:
オペランドを数値で指定します。
div(other) -> Integer[permalink][rdoc]

self を other で割った整数の商 q を返します。

ここで、商 q と余り r は、それぞれ

をみたす数です。 商に対応する余りは Numeric#modulo で求められます。 div はメソッド / を呼びだし、floorを取ることで計算されます。

メソッド / の定義はサブクラスごとの定義を用います。

[PARAM] other:
自身を割る数を指定します。
p 3.div(2) # => 1
p (-3).div(2) # => -2
p (-3.0).div(2) # => -2
divmod(other) -> [Numeric][permalink][rdoc]

self を other で割った商 q と余り r を、 [q, r] という 2 要素の配列にして返します。 商 q は常に整数ですが、余り r は整数であるとは限りません。

ここで、商 q と余り r は、

をみたす数です。 divmod が返す商は Numeric#div と同じです。 また余りは、Numeric#modulo と同じです。 このメソッドは、メソッド / と % によって定義されています。

[PARAM] other:
自身を割る数を指定します。
11.divmod(3)         #=> [3, 2]
(11.5).divmod(3.5)   #=> [3, 1.0]
11.divmod(-3)        #=> [-4, -1]
11.divmod(3.5)       #=> [3, 0.5]
(-11).divmod(3.5)    #=> [-4, 3.0]

[SEE_ALSO] Numeric#div, Numeric#modulo

eql?(other) -> bool[permalink][rdoc]

自身と other のクラスが等しくかつ == メソッドで比較して等しい場合に true を返します。 そうでない場合に false を返します。

Numeric のサブクラスは、eql? で比較して等しい数値同士が同じハッシュ値を返すように hash メソッドを適切に定義する必要があります。

[PARAM] other:
自身と比較したい数値を指定します。
p 1.eql?(1)    #=> true
p 1.eql?(1.0)  #=> false
p 1 == 1.0     #=> true

[SEE_ALSO] Object#equal?, Object#eql?, Object#==, Object#===

fdiv(other) -> Float | Complex[permalink][rdoc]

self を other で割った商を Float で返します。

Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。

[PARAM] other:
自身を割る数を指定します。
1.fdiv(3)            #=> 0.3333333333333333

[SEE_ALSO] Numeric#quo

floor -> Integer[permalink][rdoc]

自身と等しいかより小さな整数のうち最大のものを返します。

1.floor        #=> 1
1.2.floor      #=> 1
(-1.2).floor   #=> -2
(-1.5).floor   #=> -2

[SEE_ALSO] Numeric#ceil, Numeric#round, Numeric#truncate

integer? -> bool[permalink][rdoc]

self が整数の時、真を返します。そうでない場合に false を返します。

Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。

modulo(other) -> Numeric[permalink][rdoc]

self を other で割った余り r を返します。

ここで、商 q と余り r は、

をみたす数です。 余り r は、other と同じ符号になります。 商 q は、Numeric#div (あるいは 「/」)で求められます。 modulo はメソッド % の呼び出しとして定義されています。

[PARAM] other:
自身を割る数を指定します。
p 13.modulo(4)       #=>  1
p (11.5).modulo(3.5) #=> 1.0
p 13.modulo(-4)      #=> -3
p (-13).modulo(4)    #=>  3
p (-13).modulo(-4)   #=> -1
p (-11).modulo(3.5)  #=> 3.0

[SEE_ALSO] Numeric#divmod, Numeric#remainder

nonzero? -> self | nil[permalink][rdoc]

自身がゼロの時 nil を返し、非ゼロの時 self を返します。

p 10.nonzero?              #=> 10
p 0.nonzero?               #=> nil
p 0.0.nonzero?             #=> nil

require 'rational'
p Rational(0, 2).nonzero?  #=> nil

非ゼロの時に self を返すため、自身が 0 の時に他の処理をさせたい場合に以 下のように記述する事もできます。

a = %w( z Bb bB bb BB a aA Aa AA A )
b = a.sort {|a,b| (a.downcase <=> b.downcase).nonzero? || a <=> b }
b   #=> ["A", "a", "AA", "Aa", "aA", "BB", "Bb", "bB", "bb", "z"]

[SEE_ALSO] Numeric#zero?

quo(other) -> Float[permalink][rdoc]

self を other で割った商を返します。 整商を得たい場合は Numeric#div を使ってください。

Numeric#fdiv が結果を Float で返すメソッドなのに対して quo はなるべく正確な数値を返すことを意図しています。 通常は Float の値を返しますが、 rational ライブラリを require している場合は有理数の範囲に収まるなら Rational の値を返します。

Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。

[PARAM] other:
自身を割る数を指定します。
p 1.quo(3)      #=> 0.3333333333333333

require 'rational'
p 1.quo(3)      #=> Rational(1, 3)
p 1.0.quo(3)    #=> 0.3333333333333333
p 1.quo(3.0)    #=> 0.3333333333333333

[SEE_ALSO] Numeric#fdiv

remainder(other) -> Numeric[permalink][rdoc]

self を other で割った余り r を返します。

ここで、商 q と余り r は、

をみたす数です。r の符号は self と同じになります。 商 q を直接返すメソッドはありません。self.quo(other).truncate がそれに相当します。

[PARAM] other:
自身を割る数を指定します。
p 13.remainder(4)       #=>  1
p (11.5).remainder(3.5) #=> 1.0
p 13.remainder(-4)      #=>  1
p (-13).remainder(4)    #=> -1
p (-13).remainder(-4)   #=> -1
p (-11).remainder(3.5)  #=> -0.5

[SEE_ALSO] Numeric#divmod, Numeric#modulo

round -> Integer[permalink][rdoc]

自身ともっとも近い整数を返します。

中央値 0.5, -0.5 はそれぞれ 1,-1 に切り上げされます。いわゆる四捨五入ですが、偶数丸めではありません。

1.round        #=> 1
1.2.round      #=> 1
(-1.2).round   #=> -1
(-1.5).round   #=> -2

[SEE_ALSO] Numeric#ceil, Numeric#floor, Numeric#truncate

step(limit, step = 1) {|n| ... } -> self[permalink][rdoc]
step(limit, step = 1) -> Enumerable::Enumerator

self からはじめ step を足しながら limit を越える 前までブロックを繰り返します。step は負の数も指定できます。また、limit や step には Float なども 指定できます。

[PARAM] limit:
ループの上限あるいは下限を数値で指定します。step に負の数が指定された場合は、 下限として解釈されます。
[PARAM] step:
各ステップの大きさを数値で指定します。負の数を指定することもできます。
[EXCEPTION] ArgumentError:
step に 0 を指定した場合に発生します。
2.step(5){|n| p n}
2
3
4
5

1.1.step(1.5, 0.1) {|n| p n}
1.1
1.2
1.3
1.4
1.5

10.step(6, -1){|n| p n}
10
9
8
7
6

注:浮動小数点数の 0.1 は 2進数では正確な表現ができない(2進数で 0.1は 0.00011001100....となる)ので、以下のようなループでは誤差が 生じて意図した回数ループしないことがある。step はこの誤差を考慮し て実装されている。

i = 1.1
while i <= 1.5
  p i
  i += 0.1
end
=> 1.1
   1.2
   1.3
   1.4   <- 1.5 が表示されない

[SEE_ALSO] Integer#downto

to_int -> Integer[permalink][rdoc]

self.to_i と同じです。

truncate -> Integer[permalink][rdoc]

0 から 自身までの整数で、自身にもっとも近い整数を返します。

1.truncate        #=> 1
1.2.truncate      #=> 1
(-1.2).truncate   #=> -1
(-1.5).truncate   #=> -1

[SEE_ALSO] Numeric#ceil, Numeric#floor, Numeric#round

zero? -> bool[permalink][rdoc]

自身がゼロの時、真を返します。そうでない場合は false を返します。

p 10.zero?              #=> false
p 0.zero?               #=> true
p 0.0.zero?             #=> true

[SEE_ALSO] Numeric#nonzero?