SQLで四捨五入するならROUND、数値以下の整数にするならFLOOR、数値以上の整数にするならCEILINGを使います。ただし、小数部分を指定桁で切り捨てる関数名はデータベースごとに異なります。以下はMySQLの例を中心に、SQL Server・PostgreSQLとの差も整理します。
データベース別:小数点以下2桁で切り捨てる書き方
同じ値3.4567を3.45にする式は、MySQLではTRUNCATE(3.4567, 2)、SQL ServerではROUND(3.4567, 2, 1)、PostgreSQLではtrunc(3.4567::numeric, 2)です。SQL ServerのROUNDは第3引数が0以外だと切り捨てになります。
MySQLの数値関数TRUNCATE(数値, 桁数)と、テーブルのデータを削除するTRUNCATE TABLEは別物です。数値の丸めにTRUNCATE TABLEは使いません。切り上げはSQL ServerではCEILINGを使い、以下のCEILをそのまま移植しないでください。
ROUND関数で四捨五入する方法
SQLのROUND関数は、指定した小数点以下の桁数で四捨五入を行います。この関数の基本構文は次の通りです。
基本構文
ROUND(数値, 小数点以下の桁数)数値:四捨五入対象の数値。小数点以下の桁数:四捨五入後の小数点以下の桁数。
使用例
以下の例では、数値3.4567を小数点以下2桁で四捨五入します。
SELECT ROUND(3.4567, 2); -- 結果: 3.46また、第2引数(桁数)に負の値を指定すると、整数部分を四捨五入することもできます。
SELECT ROUND(345.67, -1); -- 結果: 350このように、ROUND関数を使うことで、簡単に数値の四捨五入を実現できます。
TRUNCATE関数で切り捨てる方法
MySQLのTRUNCATE関数は、指定した小数点以下の桁数で数値を切り捨てるために使用されます。この関数の基本構文は次の通りです。
基本構文
TRUNCATE(数値, 小数点以下の桁数)数値:切り捨て対象の数値。小数点以下の桁数:切り捨て後の小数点以下の桁数。
使用例
以下の例では、数値3.4567を小数点以下2桁で切り捨てます。
SELECT TRUNCATE(3.4567, 2); -- 結果: 3.45また、第2引数(桁数)に負の値を指定すると、整数部分を切り捨てることもできます。
SELECT TRUNCATE(345.67, -1); -- 結果: 340TRUNCATE関数を使用することで、小数点以下の不要な部分を取り除き、必要な精度で数値を管理することが可能です。
FLOOR関数で切り捨てる方法
SQLのFLOOR関数は、指定した数値を超えない最大の整数に切り捨てます。この関数の基本構文は次の通りです。
基本構文
FLOOR(数値)数値:切り捨て対象の数値。
使用例
以下の例では、数値3.4567を整数部分に切り捨てます。
SELECT FLOOR(3.4567); -- 結果: 3負の数値に対しても適用できます。
SELECT FLOOR(-3.4567); -- 結果: -4FLOORは単に小数部分を取り除く処理ではありません。負の値ではFLOOR(-3.4567)は-4、MySQLのTRUNCATE(-3.4567, 0)は-3です。「小さい方向に丸める」のか「0に近づけて小数部分を捨てる」のかを区別してください。
CEIL関数で切り上げる方法
SQLのCEIL関数(またはCEILING関数)は、指定した数値以上の最小の整数に切り上げます。この関数の基本構文は次の通りです。
基本構文
CEIL(数値)数値:切り上げ対象の数値。
使用例
以下の例では、数値3.4567を整数部分に切り上げます。
SELECT CEIL(3.4567); -- 結果: 4負の数値に対しても適用できます。
SELECT CEIL(-3.4567); -- 結果: -3CEIL関数を使用することで、小数点以下を完全に切り上げ、次の整数を取得することができます。これは、切り上げが必要な場合に非常に便利です。
応用例:取引データでの使用方法
小数点以下の処理は、取引データなどの実務において非常に重要です。ここでは、ROUND、TRUNCATE、FLOOR、CEIL関数を取引データに適用する具体例を紹介します。
取引金額の四捨五入
取引金額を四捨五入して表示する場合、ROUND関数を使用します。
SELECT
取引ID,
ROUND(金額, 2) AS 金額_四捨五入
FROM
取引テーブル;このクエリは、取引テーブルの金額を小数点以下2桁で四捨五入して表示します。
税額の切り捨て
MySQLで既に計算済みの税額の小数部分を除く構文例です。税の法的な端数処理方法や計算単位を定めるものではありません。実際の処理は適用する会計・業務ルールに合わせてください。
SELECT
取引ID,
TRUNCATE(税額, 0) AS 税額_切り捨て
FROM
取引テーブル;このクエリは、税額を整数部分で切り捨てて表示します。
割引後の金額の切り捨て
非負の金額について、割引率を20%なら0.20として保存している例です。割引後の金額は「金額 × (1 − 割引率)」です。整数円へ切り捨てる業務ルールの場合にFLOORを使います。
SELECT
取引ID,
FLOOR(金額 * (1 - 割引率)) AS 割引後金額_切り捨て
FROM
取引テーブル;このクエリは、割引後の金額を整数部分に切り捨てて表示します。
送料の切り上げ
送料を整数部分に切り上げる場合、CEIL関数を使用します。
SELECT
取引ID,
CEIL(送料) AS 送料_切り上げ
FROM
取引テーブル;このクエリは、送料を整数部分に切り上げて表示します。
これらの関数を使用することで、取引データの数値処理を効果的に管理することができます。
まとめ
四捨五入・切り捨て・切り上げを選ぶ前に、データベースの種類、負の値を含むか、残す桁数を確認しましょう。MySQLのTRUNCATEとFLOORは負数で結果が異なり、SQL ServerやPostgreSQLへ移植する場合は関数の書き換えが必要です。
四捨五入が想定と違う場合は数値型も確認
金額など十進数の桁を厳密に扱う列は、必要な精度・桁数を持つDECIMAL/NUMERICを検討します。MySQLのROUNDは正確値と近似値で中間値の丸め方が異なることがあり、PostgreSQLもnumericとdouble precisionでは丸めの扱いが異なります。FLOAT/DOUBLEの値を後から変換しても、既に生じた近似誤差を完全に戻せるわけではありません。
ROUNDは表示形式を指定する関数ではありません。結果を必ず「3.40」のように末尾の0まで表示したい場合は、数値型とクライアント側の表示書式も確認します。SELECTの例は取得結果の計算であり、保存済みデータをUPDATEする処理ではありません。


コメント