MySQL関数リファレンス

小数点以下を四捨五入する (ROUND)

スポンサードリンク
書式
ROUND( 数値 )

【注意】
ROUND関数を使用することでできるのは「数値を丸める」ことで、「四捨五入をする」ことではありません。
ただ一般的にROUND関数の動作を四捨五入という表現が使用されることが多いため、ページのタイトルを四捨五入としています。
「丸め」については後ほど説明しますが、「丸め」ではなく「四捨五入」を実現したい場合はFLOOR関数を使用して以下のように計算することができます。

書式
--小数点以下第一位を四捨五入する
FLOOR( 数値 + 0.5 )

--小数点以下第N位を四捨五入する
FLOOR( 数値 * POW( 10, N-1 ) + 0.5 ) / POW( 10, N-1 )

--※上記の方法では負の数値の場合、ゼロの方向に丸めますが、
--逆方向に丸めたい場合は 0.5 の部分を 0.5 * SIGN( 数値 ) とする。
例1(FLOOR関数を使用して小数点第一位を四捨五入する)
mysql> SELECT FLOOR( 1.5 + 0.5 );
+--------------------+
| FLOOR( 1.5 + 0.5 ) |
+--------------------+
|                  2 |
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT FLOOR( 1.49999999999 + 0.5 );
+------------------------------+
| FLOOR( 1.49999999999 + 0.5 ) |
+------------------------------+
|                            1 |
+------------------------------+
1 row in set (0.00 sec)
例2(FLOOR関数を使用して小数点第三位を四捨五入する)
mysql> SELECT FLOOR( 15.345 * POW( 10, 3-1 ) + 0.5 ) / POW( 10, 3-1 );
+---------------------------------------------------------+
| FLOOR( 15.345 * POW( 10, 3-1 ) + 0.5 ) / POW( 10, 3-1 ) |
+---------------------------------------------------------+
|                                                   15.35 |
+---------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT FLOOR( 15.344999 * POW( 10, 3-1 ) + 0.5 ) / POW( 10, 3-1 );
+------------------------------------------------------------+
| FLOOR( 15.344999 * POW( 10, 3-1 ) + 0.5 ) / POW( 10, 3-1 ) |
+------------------------------------------------------------+
|                                                      15.34 |
+------------------------------------------------------------+
1 row in set (0.00 sec)

さて、ROUND関数の機能である「丸め」についてですが、MySQL のリファレンスでは以下のように説明されています。


注意: 引数の値が 2 つの整数の中間にある場合の ROUND() の動作は、C ライブラリの実装に応じて決まる。実装に応じて、最も近い偶数に丸められる場合と、常に切り上げまたは切り下げられる場合、あるいは常にゼロ方向に丸められる場合がある。特定の丸め方法を必要とする場合は、この関数ではなく、TRUNCATE() や FLOOR() などの明確に定義された関数を使用するようにする。
MySQL 4.1 リファレンスマニュアルより
上記のマニュアルによると「整数の中間にある」すなわち、0.5や1.5、2.5という数値の場合の処理については、以下の4パターンがあるということになります。

(1) 最も近い偶数に丸められる
(俗に「JIS丸め」、「Bankers Rounding(銀行の丸め)」とも呼ばれる)
(2) 常に切り上げられる
(3) 常に切り下げられる
(4) 常にゼロ方向に丸められる

そして、このうちどの方法が選択されるかについては「C ライブラリの実装に応じて決まる」ということです。
つまり、実行している環境によって実行結果が異なるということです。
実際に (1) ~ (4) の方法で丸められた場合の結果を比較すると以下の通りとなります。

丸める数値
1.52.5-1.5-2.5
(1) 最も近い偶数に丸められる22-2-2
(2) 常に切り上げられる23-1-2
(3) 常に切り下げられる12-2-3
(4) 常にゼロ方向に丸められる12-1-2

ちなみに私が使用しているPCの Windows XP + MySQL4.1.19の環境では、丸めの際に(3)のように動作します。

例3( Windows XP + MySQL4.1.19で丸め )
mysql> SELECT ROUND( 1.5 );
+--------------+
| ROUND( 1.5 ) |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

mysql> SELECT ROUND( 2.5 );
+--------------+
| ROUND( 2.5 ) |
+--------------+
|            2 |
+--------------+
1 row in set (0.00 sec)

別の環境 Linux + MySQL4.0.27 では(1)のいわゆる「偶数丸め」となります。

例4(Linux + MySQL4.0.27で丸め)
mysql> SELECT ROUND( 1.5 );
+--------------+
| ROUND( 1.5 ) |
+--------------+
|            2 |
+--------------+
1 row in set (0.00 sec)

mysql> SELECT ROUND( 2.5 );
+--------------+
| ROUND( 2.5 ) |
+--------------+
|            2 |
+--------------+
1 row in set (0.00 sec)

このように環境に応じて動作が変わってしまうため、ROUND関数を使用する場合は十分な注意が必要です。
もし可能であるならば、FLOOR関数、CEILING関数、TRUNCATE関数などで代替するのが良いでしょう。

スポンサードリンク
Rではじまる MySQL の関数 / 数値を扱う関数

数値を扱う関数

絶対値を求める (ABS)
剰余を求める (MOD)
小数点以下を切り下げる (FLOOR)
小数点以下を切り上げる (CEILING)
小数点以下を切り上げる (CEIL)
小数点以下を四捨五入する (ROUND)
対数を求める (LOG)
2を底とした対数を求める (LOG2)
10を底とした対数を求める (LOG10)
累乗(べき乗)を求める (POW)
累乗(べき乗)を求める (POWER)
符号を調べる (SIGN)
平方根を求める (SQRT)
円周率を求める (PI)
乱数を生成する (RAND)
最小値を調べる (LEAST)
最大値を調べる (GREATEST)
ラジアンを度に変換する (DEGREES)
度をラジアンに変換する (RADIANS)
小数点第N位で切り捨てる (TRUNCATE)
数値を整形する (FORMAT)
スポンサードリンク

Rではじまる MySQL の関数

RADIANS 度をラジアンに変換する
RAND 乱数を生成する
REPEAT 任意の文字列を任意の数だけ生成する
REVERSE 文字列を反転させる
RIGHT 文字列の右側から文字列を取り出す
ROUND 小数点以下を四捨五入する
RPAD 特定の文字を右端に追加して文字列の長さを整える
RTRIM 文字列の右側から半角スペースを削除する