SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【MySQL】ROUND関数

【MySQL】ROUND()関数

MySQL4系と5系でマニュアルの記載が変わっています。動作も違います。

結論から言うと

「四捨五入したいときはround()関数は使うな」。四捨五入=round()とは限らない。

0.5を足して切り捨てる(truncate(x + 0.5))など書いたとおりの結果を得る書き方があるので、そちらがオススメです。

動作の確認

MySQL4.1でround()
mysql> select round(0.5), round(1.5), round(2.5);
+------------+------------+------------+
| round(0.5) | round(1.5) | round(2.5) |
+------------+------------+------------+
|          0 |          2 |          2 |
+------------+------------+------------+
MySQL5.1でround()
mysql> select round(0.5), round(1.5), round(2.5);
+------------+------------+------------+
| round(0.5) | round(1.5) | round(2.5) |
+------------+------------+------------+
| 1          | 2          | 3          |
+------------+------------+------------+

4系では、環境によって違いますが、C ライブラリの実装に応じて決まるとのことで、偶数方向への丸め(Banker’s Rounding)がおこなわれ、期待している四捨五入にならないと有名だったと思います。

4系のround()関数の偶数方向への丸めは JIS Z 8401 に書いてあるとおりで、これもひとつの一般的な丸めです。丸めて演算して丸めて演算して…が繰り返されるとき、誤差を最小限にするための工夫です。

5系のround()は、引数が近似数値のときは上の誤差を最小限にするための偶数方向への丸めをおこない、高精度値数のときはいわゆる四捨五入となりましたが、依存しない方がよいと思います。

身近なExcelの中でも、VBA関数のROUND()はJIS丸め、ワークシート関数のROUND()は四捨五入らしいです。

参考

http://dev.mysql.com/doc/refman/4.1/ja/mathematical-functions.html

http://dev.mysql.com/doc/refman/5.1/ja/mathematical-functions.html

関連するメモ

コメント