ROUND( 数値 )
【注意】
ROUND関数を使用することでできるのは「数値を丸める」ことで、「四捨五入をする」ことではありません。
ただ一般的にROUND関数の動作を四捨五入という表現が使用されることが多いため、ページのタイトルを四捨五入としています。
「丸め」については後ほど説明しますが、「丸め」ではなく「四捨五入」を実現したい場合はFLOOR関数を使用して以下のように計算することができます。
--小数点以下第一位を四捨五入する FLOOR( 数値 + 0.5 ) --小数点以下第N位を四捨五入する FLOOR( 数値 * POW( 10, N-1 ) + 0.5 ) / POW( 10, N-1 ) --※上記の方法では負の数値の場合、ゼロの方向に丸めますが、 --逆方向に丸めたい場合は 0.5 の部分を 0.5 * SIGN( 数値 ) とする。
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)
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 のリファレンスでは以下のように説明されています。
丸める数値 | ||||
1.5 | 2.5 | -1.5 | -2.5 | |
(1) 最も近い偶数に丸められる | 2 | 2 | -2 | -2 |
(2) 常に切り上げられる | 2 | 3 | -1 | -2 |
(3) 常に切り下げられる | 1 | 2 | -2 | -3 |
(4) 常にゼロ方向に丸められる | 1 | 2 | -1 | -2 |
ちなみに私が使用しているPCの Windows XP + MySQL4.1.19の環境では、丸めの際に(3)のように動作します。
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)のいわゆる「偶数丸め」となります。
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関数などで代替するのが良いでしょう。