コマンド道場

$ man round

ROUND

数値関数

数値を丸める。桁数を指定できるが、指定できる型が製品によって違う。

呼び出しの形

ROUND(数値)
ROUND(数値, 桁数)

つまずきやすいところ

  • PostgreSQL の 2 引数 ROUNDnumeric 専用です。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
seisushousu2sen_no_kurai
542003542002.78542000

1

負の桁数を渡すと、1000 の位で丸められます。

double precision に 2 引数の ROUND は使えない
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 引数の ROUNDnumeric にしかありません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

製品ごとの対応表(根拠つき)を見る

次に読む

関係する関数

根拠にした一次情報