余りを求める、剰余算(余り算)
MOD ( number1 [, number2] )
REMAINDER ( number1 [, number2] )
return [ number | binary_float | binary_double ]
number1 | 余りを求める数値式 | |
number2 | 割り算を行なう数値式 | |
- 数値式 number1 を 数値式 number2 で割った余りを優先順位の高い数値データ型で戻す。
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 関数