$ man round
ROUND
数値関数数値を丸める。桁数を指定できるが、指定できる型が製品によって違う。
呼び出しの形
ROUND(数値) ROUND(数値, 桁数)
つまずきやすいところ
PostgreSQL の 2 引数
ROUNDはnumeric専用です。double precisionに使うと「関数が存在しません」で落ちます。⚠️ 下の対応表はROUND(numeric, n)が通るかを測ったものなので、この型の問題とは別です。numericは四捨五入、double precisionは偶数丸めです。型で丸め方が変わります。表示のために丸めた値を、そのまま次の計算に使わないでください。丸め誤差が積み上がって合計が合わなくなります。
実行例
結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。
SELECT ROUND(AVG(salary)) AS seisu, ROUND(AVG(salary), 2) AS shousu2, ROUND(AVG(salary), -3) AS sen_no_kurai FROM shain
| seisu | shousu2 | sen_no_kurai |
|---|---|---|
| 542003 | 542002.78 | 542000 |
1 行
負の桁数を渡すと、1000 の位で丸められます。
SELECT ROUND(AVG(salary)::double precision, 2) FROM shain
実行するとこうなります
ERROR: function round(double precision, integer) does not exist
PostgreSQL では numeric に変換してから渡す必要があります。
説明
ROUND は数値を丸めます。引数を 2 つ渡すと、小数第何位まで残すかを指定できます。負の桁数を渡せば、10 の位・100 の位で丸められます。
⚠️ PostgreSQL では、2 引数の ROUND は numeric にしかありません。double precision の列にそのまま使うとエラーになります。ROUND(値::numeric, 2) のように型を変換してから渡してください。金額を最初から numeric で持っておけば、この問題は起きません。
丸め方にも差があります。PostgreSQL の numeric は四捨五入(0.5 を切り上げ)ですが、double precision は偶数丸め(0.5 を偶数側へ)です。1 円の差が問題になる計算では、型から決めてください。
ほかの製品でも通るか
主要 7 製品で通用 そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database / IBM Db2
次に読む
根拠にした一次情報
- PostgreSQL 18 マニュアル: 数学関数と演算子(2026-09-02 確認)