余りを求める、剰余算(余り算)

syntax

MOD ( number1 [, number2] )
REMAINDER ( number1 [, number2] ) Oracle 10g
return [ number | binary_float | binary_double ]

parameter

number1余りを求める数値式
number2割り算を行なう数値式

return

  • 数値式 number1 を 数値式 number2 で割った余りを優先順位の高い数値データ型で戻す。

avail

  • SQL および PL/SQL の両方で使用可能。

MOD 関数の内容

広く知れ渡っている余り算と認識している。(※)
正の値の余りは必ず正の値になる。
数値の型は優先順位の高い型に変換されて計算される。BINARY_DOUBLE > BINARY>FLOAT > NUMBER

(※) マニュアルによると「古典数学の余り算」と負の領域で異なる結果になるそうですので詳細を知りたい方はマニュアルを確認した方がよいでしょう。

注意

MOD や REMINDER のマニュアルと合っていない場合がありそうなので… 計算式としては以下のようになっている。

  • 古典数学の余り算の式は number1 - number2 * FLOOR ( number1 / number2 )
  • MOD による余り算の式は number1 - number2 * TRUNC ( number1 / number2 )

一応確認してみる

SQL> select num1, num2,
  2         mod(num1, num2),
  3         num1 - num2 * FLOOR(num1/num2) classical_mod, -- 古典数学
  4         num1 - num2 * TRUNC(num1/num2) trunc_mod
  5   from mod_sample;
 
      NUM1       NUM2 MOD(NUM1,NUM2) CLASSICAL_MOD  TRUNC_MOD
---------- ---------- -------------- ------------- ----------
        11          7              4             4          4
        11         -7              4            -3          4
      10.3         10             .3            .3         .3
        10     3.3333          .0001         .0001      .0001

REMAINDER 関数の内容

MOD は余りに TRUNC を使用するが REMAINDER は ROUND を使用しているためマイナスにもなる。

使い道が良くわからない余り算であるが 「数値式 number2 の値」 と 「number2 の前後にある 数値式 number2 の倍数値」 でより近い値との「誤差」という利用法なのであろうか?

REMAINDER 関数の計算式は number1 - number2 * ROUND ( number1 / number2 )
MOD は余りに TRUNC を使用するが REMAINDER は ROUND を使用しているため整数の余りでもマイナスにもなることがある。

REMAINDER(11, 7) ⇒ -3
x - REMAINDER(x,7) ⇒ 数値 x の前後で 7 の倍数により近い数値を戻す


関連 SQL 関数

 
アルファベット別 関数一覧 ショートカット
ABCDEFG
HILMNOP
RSTUVWX
日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)