このセクションでは、ROUND()
関数、および厳密値型 (DECIMAL
と整数) を持つカラムへの挿入での高精度計算の丸めについて説明します。
ROUND()
関数は、その引数が厳密値または近似値のどちらであるかに応じて、異なった方法で丸めます。
真値の数値の場合、
ROUND()
は「四捨五入」ルールを使用します。0.5 以上の小数部を持つ値は、正の場合は次の整数に切り上げられ、負の場合は次の整数に切り下げられます。 (つまり、ゼロから遠い方に丸められます。) 0.5 未満の小数部を持つ値は、正の場合は次の整数に切り下げられ、負の場合は次の整数に切り上げられます。 つまり、ゼロに丸められます。)近似値の数字の場合、結果は C ライブラリによって異なります。 多くのシステムでは、これは
ROUND()
が「「最も近い偶数に丸める」」ルールを使用することを意味: 2 つの整数の間に小数部がある値は、最も近い偶数の整数に丸められます。
次の例では、正確な値の丸めと近似値の丸めの相違点を示します。
mysql> SELECT ROUND(2.5), ROUND(25E-1);
+------------+--------------+
| ROUND(2.5) | ROUND(25E-1) |
+------------+--------------+
| 3 | 2 |
+------------+--------------+
DECIMAL
または整数カラムへの挿入では、ターゲットが厳密値データ型であるため、挿入される値が厳密値または近似値のどちらであるかには関係なく、丸めでは「四捨五入」が使用されます。
mysql> CREATE TABLE t (d DECIMAL(10,0));
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO t VALUES(2.5),(2.5E0);
Query OK, 2 rows affected, 2 warnings (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 2
mysql> SHOW WARNINGS;
+-------+------+----------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------+
| Note | 1265 | Data truncated for column 'd' at row 1 |
| Note | 1265 | Data truncated for column 'd' at row 2 |
+-------+------+----------------------------------------+
2 rows in set (0.00 sec)
mysql> SELECT d FROM t;
+------+
| d |
+------+
| 3 |
| 3 |
+------+
2 rows in set (0.00 sec)
SHOW WARNINGS
ステートメントは、小数部の丸めによって切り捨てられた場合に生成されるノートを表示します。 このような切捨ては、厳密な SQL モードでもエラーになりません (セクション12.25.3「式の処理」 を参照)。